1、slots__是什么:是一个类变量,变量值可以使列表、元组或者可迭代对象,也可以是一个字符串(意味着所有实例只有一个数据属性)
2、引子:使用点来访问属性本质就是在访问类或者对象的__dict__属性字典(类的字典是共享的,每个实例的字典是独立的)
3、为何使用__slots:字典会占用大量内存,如果你有一个属性很少的类,但是有很多实例,为了节省内存就可以使用__slots__取代实例的__dict__
class Foo:
#__slots__ = ['name','age']
__slots__ = 'name'
#优势:省内存,不要用于限制实例设定,它会使__dict__用不了,慎用
f1 = Foo()
f1.name = 'aaa'
print(f1.name)
#f1.age = 12 #会报错
print(f1.__slots__)
print(Foo.__slots__)
__doc__ #特点:不会被继承
__module__ #查看函数来自哪个模块
__class__ #查看函数来自哪个类
__del__ # 析构方法,当对象在内存中被释放时,自动触发执行(del 对象 或 程序执行完毕 都会调用该方法)
__call__ #对象后面加括号,触发执行
class Foo:
'我是描述信息'
pass
class Bar(Foo):
pass
print(Foo.__dict__)
print(Bar.__dict__) #__doc__ 不会被继承
class Foo:
def __call__(self, *args, **kwargs):
print('执行实例。。。')
f1 = Foo()
f1() #用的 Foo 下的 __call__ 方法
Foo() #用的 abc 下的 __call__ 方法