class Foo:
"这时文档doc属性"
__slots__ = ["name","age"] #[“name”=None,“age"= None] ,slots等于的值是key
def __call__(self, *args, **kwargs): #对象后加()时执行
print("执行obj()")
f1 = Foo() #实质是触发类属性中的__call__,产生一个实例
f1.name = "ss" #这里的属性添加只能添加类中slots定义的哪些key
print(f1.name)
print(f1.__slots__) #这时不存在__dict__
f1() #对象后加()触发call
"""
__slots__ = :类每次实例化都会产生一个对象字典,而这些字典会占用内存,为了节省内存使用__slots__代替__dict__
当定义一个__slots__时,它会代替实例字典,通过一个固定大小的数组来构建字典,而不用每次实例化产生字典
但这种方式就不能为实例添加新的属性,只能使用__slots__中定义的属性名
注意定义__slots__后它的特性都基于普通字典实现,且一些类的特性将无法实现,例如多继承
"""
print(Foo.__doc__) #显示类中的文档信息,不写默认为None
#注意__doc__这个属性是不能被继承的,因为每个类中都有一个默认的__doc__属性
"""
obj.__module__ 显示这个对象是由哪个模块产生的
obj.__class__ 显示这个对象是由哪个类产生的
def __del__(self) 析构方法,当且仅当对象在内存中释放时,触发执行,但Python中一般不用定义,Python有自动回收机制
__call__(self,*args,**kwargs) 当对象后面加()是出触发它
"""