我理解,一旦我们添加__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
中?
答案 0 :(得分:2)
__slots__
不仅可以节省内存,还可以更快的访问权限。 (访问元组而不是字典)
取自python' __slots__
doc:
广告位声明的操作仅限于定义它的类。因此,子类将具有 dict ,除非它们还定义插槽(其中必须只包含任何其他插槽的名称)。
因此继承__slots__
,但也为子类创建了__dict__
属性,除非明确定义子类中的__slots__
对象
还有其他一些值得一提的说明,请查看slots doc