nal*_*zok 1 python inheritance class setattr new-style-class
根据Python 2.7.12文档:
\n\n\n\n\n如果
\n__setattr__()想要分配给实例属性,则不应简单地执行self.name = value\xe2\x80\x94,否则会导致对其自身的递归调用。相反,它应该将值插入到实例属性的字典中,例如self.__dict__[name] = value。对于新式类,不应访问实例字典,而应调用基类的同名方法,例如object.__setattr__(self, name, value)。
然而,下面的代码可以正常工作:
\n\nclass Class(object):\n def __setattr__(self, name, val):\n self.__dict__[name] = val;\n\nc = Class()\nc.val = 42\nprint c.val\nRun Code Online (Sandbox Code Playgroud)\n\n我知道super(Class, obj).__setattr__(name, value)可以确保__setattr__所有基类的方法都被调用,但是经典类也可以从基类继承。那么为什么只推荐新风格的课程呢?
或者,另一方面,为什么经典课程不建议这样做?
\n新样式的类可以使用slot,此时没有__dict__可分配的空间。新型类还支持其他数据描述符,即在类上定义的处理某些名称的属性设置或删除的对象。
来自插槽的文档:
默认情况下,旧样式类和新样式类的实例都有一个用于属性存储的字典。这会浪费实例变量很少的对象的空间。创建大量实例时,空间消耗可能会变得严重。
__slots__可以通过在新式类定义中进行定义来覆盖默认值。该__slots__声明采用一系列实例变量,并在每个实例中保留足够的空间来保存每个变量的值。__dict__由于不是为每个实例创建空间,因此可以节省空间。
对槽的访问是通过在类上添加数据描述符来实现的;每个此类属性具有__set__和/或方法的对象。__del__
数据描述符的另一个示例是附加了设置器或删除器函数的property()对象。设置与 中的描述符对象同名的键__dict__将被忽略,因为数据描述符会导致属性查找__dict__完全绕过。
object.__setattr__()知道如何处理数据描述符,这就是为什么你应该调用它。
| 归档时间: |
|
| 查看次数: |
2857 次 |
| 最近记录: |