1._dict__属性
在没使用 的情况下, 会为每个实例创建一个 字典,来保存实例的所有属性。在进行属性寻找的时候,会先在对象的 中找,找不到,就去类的 中找,再找不到就去父类的 中找,。。
2.__slots__属性
类是创建对象的模版。在静态类型语言中,对象只能拥有类中定义的那些属性。而在Python中,可以在运行时,随意的增加或删除对象的属性。这就很可能造成:运行时,为对象增加了很多属性,占用了很多的内存。为了避免类似的现象, Python的新式类提供了 类属性,用来限制类的对象所能拥有的属性 。
默认情况下, 会为每一个实例创建一个属性字典 ,用来保存实例的所有属性。但是当使用 时, 不会为实例创建该字典。
当父类没有 时,子类仍然有 , 之外的属性,会被保存到属性字典中。此时, 的意义,也就不大了。
当父类也有 时,子类的 的值,可以看成是自己的 加上 父类的 。
3.描述符
(1.有三个方法:
重写了其中一个或多个方法的对象,就是描述符。
(2.注意:
描述符必须是新式类的对象
描述符是在 方法中,被调用的。重写 方法,可能会阻止描述符的自动调用
描述符必须是类属性(因此,描述符是被类的所有实例所共享的)。当使用该类的实例访问描述符时,会自动调用 方法;设置描述符时,会自动调用 方法;删除描述符时,会自动调用 方法
Python中的很多高级特性,都是通过描述符实现的。比如,staticmethod、classmethod等。
(3.下面看一个自己实现classmethod的例子:
4.与属性相关的魔术方法
(1.属性访问
它是新式类的一个魔术方法,访问对象的任意属性时,都会先调用这个方法。如果这个方法,抛出AttributeError,则调用对象的 方法
当对象没有名为 的属性时,就会调用它的 方法
(2.当使用内建函数getattr(obj, attr_name, ...)获取obj的属性时:
如果是新式类,则先调用 方法,如果出AttributeError,则调用 方法
如果是经典类,在找不到该属性的情况下,会调用 方法
(3.需要注意的是:
在 和 方法中,调用 可能会造成死递归。一个解决方案是使用 (新式类)。
(4.设置属性
当设置对象的属性时,会调用这个魔术方法。
当使用内建函数setattr(obj, name, value)设置对象的属性时,会调用 方法。所以在 方法中,调用 可能造成死递归。一个解决方案是使用属性字典 。比如:
(5.删除属性
方法 和 delattr内建函数:
作者:蒂米的博客
转载请注明出处
http://timd.cn/python-attribute/?utm_source=tuicool&utm_medium=referral
领取专属 10元无门槛券
私享最新 技术干货