2016-05-28 3 views
-5

Это от the Python docs. Я не понимаю этого, может ли кто-нибудь привести примеры?Как понять этот документ

Если класс определяет слот, также определенный в базовом классе, экземпляр переменной определяется слот базового класса недоступен (за исключением извлечения его дескриптор непосредственно из базового класса). Это отображает значение программы undefined. В будущем для предотвращения этого может быть установлен код .

Я попытался сделать пример этого, но не смог. Когда я запускаю программу ниже, она печатает 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() 
+0

Выдержка довольно прямолинейна. Точно, какую часть этого вы не понимаете? –

+0

Я попытался привести пример, чтобы ответить на ваш вопрос, и обнаружил противоположное тому, что говорили документы, поэтому я отредактировал его на ваш вопрос, и теперь мне также интересно узнать, какие ответы у людей есть. –

+0

переменная экземпляра, определенная слотом базового класса, недоступна, b = Base() print b.a Я думал, что b.a недоступен, что недоступно? – user2352151

ответ

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.a и Subclass.a независимы, несмотря на общее название.

+0

Если подкласс не имеет __slots__, x = Subclass(); Base.a .__ get __ (x) будет работать, документ означает это? Я всегда думал, что это b = Base(); то b.a недоступен! – user2352151

Смежные вопросы