如何理解这个文档

时间:2016-05-28 17:19:27

标签: python slot

这是the Python docs。我不明白这一点,有人会举一些例子吗?

  

如果一个类定义了一个也在基类中定义的槽,那么该实例   由基类槽定义的变量是不可访问的(除了   直接从基类检索其描述符)。这呈现   程序的含义未定义。将来,可能会进行检查   添加以防止这种情况。

我试图做一个这样的例子,但失败了。当我运行下面的程序时,它会打印1,因此变量不可访问。什么时候会?

class Base(object):
    __slots__ = 'a'

    def __init__(self):
        self.a = 1

class Subclass(Base):
    __slots__ = 'a'

    def __init__(self):
        super(Subclass, self).__init__()
        print self.a

Subclass()

1 个答案:

答案 0 :(得分:2)

  

当我运行下面的程序时,它打印1,因此变量不可访问。

这里实际上有两个 a个实例变量。 Base定义的那个不能通过属性访问访问;对于Subclass类型的对象,对self.a的所有访问(包括Base.__init__内的访问)都会转到Subclass定义的实例变量。

如果手动检索Base.a描述符,则可以访问Base定义的插槽:

>>> x = Subclass()
1
>>> Base.a.__get__(x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: a
>>> Base.a.__set__(x, 2)
>>> Base.a.__get__(x)
2
>>> Subclass.a.__get__(x)
1

正如您所看到的,Base.aSubclass.a是独立的,尽管名称相同。