版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
深入对象与类
import sys
class Player():
def __init__(self,uid,name,status = 0, level = 0):
self.uid = uid
self.name = name
self.status = status
self.level = level
class Player2(object):
__slots__ = ['uid','name','status','level']#关闭动态属性
def __init__(self,uid,name,status = 0, level = 0):
self.uid = uid
self.name = name
self.status = status
self.level = level
P1 = Player(1,'sansan')
print(dir(P1))
print(P1.__dict__)#动态绑定属性
P1.age = 18
print(P1.__dict__)
P2 = Player2(2,'ss')
print(dir(P2))
# P2.age = 18
# print(P2.__dict__)#没有的
print(set(dir(P1))-set(dir(P2)))
print(sys.getsizeof(P1.__dict__))
print(sys.getsizeof(P1.name))
print(sys.getsizeof(P1.uid))
#dir()自省机制
#在python中动态属性是用__dict__绑定的
跟踪内存使用
tracemalloc —跟踪内存分配的参考网址参考网址
class Player():
def __init__(self,uid,name,status = 0, level = 0):
self.uid = uid
self.name = name
self.status = status
self.level = level #size=10.7 MiB __dict__所占的内存
class Player2(object):
__slots__ = ['uid','name','status','level']#关闭动态属性,不让你瞎加属性
def __init__(self,uid,name,status = 0, level = 0):
self.uid = uid
self.name = name
self.status = status
self.level = level
import tracemalloc
tracemalloc.start()
# P1 = [Player(1,'ss') for _ in range(100000)] #size=6274 KiB size=16.8 MiB
P2 = [Player2(1,'ss') for _ in range(100000)] #size=7837 KiB size=7837 KiB
snapshot = tracemalloc.take_snapshot()
# top_stats = snapshot.statistics('lineno')
top_stats = snapshot.statistics('filename')
for start in top_stats[:10]:
print(start)
上下文管理器
#上下文管理器
'''
with open() as f:
pass
若要把类变成一个文件,要在内部实现下列两种方法
__enter__
__exit__
'''
# class play(object):
# def __enter__(self):
# print("start")
# return self
# #获取资源
# #进入对象的运行时上下文, with语句会把这个方法的返回值赋给as指定的变量.
# def __exit__(self, exc_type, exc_val, exc_tb):
# #释放资源
# print("end")
#
# def info(self):
# print("info")
#
# with play() as d:
# d.info()
#简化上下文管理器
import contextlib
#可以把函数装饰成上下文管理器
@contextlib.contextmanager
def file_open(filename):
print("file open")
#生成器
yield{}
print("file end")
with file_open("11.txt") as f:
print("file option")
类支持比较操作
from functools import total_ordering
@total_ordering #这样我们只需完成其中的两个方法就可以比较所有
class Rect(object):
def __init__(self,w,h):
self.w = w
self.h = h
def area(self):
return self.w*self.h
def __lt__(self, other):
return self.area() < other.area()
def __eq__(self, other):
return self.area() == other.area()
def __str__(self):
return "Rect:(%s,%s)"%(self.w, self.h)
rect1 = Rect(1,2)
# rect1 = Rect(3,2)
import math
class Circle(object):
def __init__(self,r):
self.r = r
def area(self):
return self.r**2*math.pi
def __lt__(self, other):
return self.area() < other.area()
def __eq__(self, other):
return self.area() == other.area()
c = Circle(3)
print(c > rect1)