python继承中的插槽

Slots in python inheritance

本问题已经有最佳答案,请猛点这里访问。

我理解,一旦我们添加了__slots__,我们就限制了可以在类中使用的属性,尽管主要目的是保存所创建实例的内存(不存储在__dict__中)。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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__

这就是我困惑的时候。首先,如果继承了__slots__,那么"b"中甚至不应该有__dict__,因为根据槽的定义,实例属性不能存储在dict中。为什么nameage不存储在b.__dict__中?


__slots__不仅节省了内存,而且访问速度更快。(访问元组而不是dict)

摘自python的__slots__文档:

The action of a slots declaration is limited to the class where it is defined. As a result, subclasses will have a dict unless they also define slots (which must only contain names of any additional slots).

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

还有几条值得一提的注释,请检查插槽文档