python继承中的插槽

时间:2017-09-17 01:45:35

标签: python-2.7

我理解,一旦我们添加__slots__,我们就会限制可以在类中使用的属性,尽管主要目的是节省已创建实例的内存(不将其存储在{{1}中) })

但我不完全理解__dict__在继承时的行为。

__slots__

这是我困惑的时候。首先,如果继承class Vector(object): __slots__ = ('name','age') def __init__(self): self.name = None self.age = None class VectorSub(Vector): def __init__(self): self.name = None self.age = None self.c = None a = Vector() # b = VectorSub() print dir(a) # __slots__ defined and no __dict__ defined here, understandable print dir(b) # Both __dict__ and __slot__ defined. #So __slots__ is inherited for sure. print a.__dict__ #AttributeError: has no attribute '__dict__, understandable print b.__dict__ #{'c': None} ... How? print b.name # Works, but why? 'name' not in b,__dict__ ,则“b”中甚至不应该有__slots__,因为实例属性不能存储在dict中 - 通过槽的定义。另外,为什么__dict__name未存储在b。age中?

1 个答案:

答案 0 :(得分:2)

__slots__不仅可以节省内存,还可以更快的访问权限。 (访问元组而不是字典)

取自python' __slots__ doc:

  

广告位声明的操作仅限于定义它的类。因此,子类将具有 dict ,除非它们还定义插槽(其中必须只包含任何其他插槽的名称)。

因此继承__slots__,但也为子类创建了__dict__属性,除非明确定义子类中的__slots__对象

还有其他一些值得一提的说明,请查看slots doc