slots_doc_call属性

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)   当对象后面加()是出触发它
"""

 

posted @ 2019-05-15 00:38  saber゛  Views(161)  Comments(0)    收藏  举报