2013-11-18 2 views
2

В приведенном ниже примере суперкласс имеет атрибут __dict__, тогда как подкласс не имеет его.Подкласс Python не имеет __dict__, а у суперкласса есть?

>>> class Super(object): 
...  def hello(self): 
...  self.data1="hello" 
... 
>>> 
>>> class Sub(Super): 
...  def hola(self): 
...  self.data2="hola" 
... 
>>> 
>>> Super.__dict__ 
<dictproxy object at 0x108794868> 
>>> Super.__dict__.keys() 
['__dict__', '__module__', '__weakref__', 'hello', '__doc__'] # note __dict__ 
>>> Sub.__dict__.keys() 
['__module__', '__doc__', 'hola'] #__dict__ absent here 
>>> Sub.__dict__ 
<dictproxy object at 0x108794868> 

1: Замечания по вышеуказанным шоу, где ДИКТ присутствует. почему у суперкласса есть это, но не подкласса.

, пытаясь найти ответ на этот вопрос, я наткнулся на это post., и это меня смутило.

>>> class Foo(object): 
... __slots__ = ('bar',) 
... bar="spam" 
... 
>>> f = Foo() 
>>> f.__dict__ 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'Foo' object has no attribute '__dict__' 
>>> class A(object): 
... pass 
... 
>>> b = A() 
>>> b.__dict__ 
{} 

Q2: почему instance из Foo бросков AttributeError но из A имеет пустой Dict.

+0

Что говорят 'dir (Super)' и 'dir (Sub)' say? – SethMMorton

+0

оба, похоже, имеют '__dict__' с вызовом dir() –

+0

Вот [некоторая информация] (http://stackoverflow.com/questions/4877290/what-is-the-dict-dict-attribute-of-a-python- класс) о '__dict __ ['__ dict __']', но он не дает понять, почему это не в подклассе. – hunse

ответ

0

Класс с слотами не имеет dict. Здесь есть конфликт между «баром» и слотами. Удалите «бар», и он будет работать нормально.

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