Наследование и внутренние классы в Python? - PullRequest
17 голосов
/ 08 апреля 2011

В следующем коде класс B унаследовал атрибут yay от класса A, я ожидал этого. Я также ожидал бы, что внутренний класс B.Foo ведет себя так же, но это не так.

Как заставить B.Foo наследовать атрибут alice от класса A? Мне нужно, чтобы внутренний подкласс Foo в B имел оба атрибута alice и bob.

Спасибо.

>>> class A:
...     yay = True
...     class Foo:
...             alice = True
...
>>> class B(A):
...     nay = False
...     class Foo:
...             bob = False
>>> B.yay
True
>>> B.Foo.alice
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: class Foo has no attribute 'alice'

Ответы [ 3 ]

13 голосов
/ 08 апреля 2011

Причина, по которой B.Foo.alice выдал ошибку, заключается в том, что нет никакой связи между атрибутом Foo класса A и атрибутом Foo класса B.

В B,Атрибут Foo имеет значение объекта класса, которое полностью заменяет значение объекта класса, унаследованное от A.

Это должно исправить это:

class B(A):
    nay = False
    class Foo(A.Foo):
        bob = False

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

В случае класса B, у нас есть:

  1. yay атрибут, которыйимеет значение True, унаследованное от атрибута A.
  2. nay, значение False.
  3. Foo, атрибут объекта класса.

Методы класса также являются атрибутами, которые имеют в качестве значений вызываемые объекты.

8 голосов
/ 08 апреля 2011

Наследование - вещь для класса. В вашем коде класс B наследуется от класса A, но тот факт, что оба они имеют внутренний класс Foo, ничего не говорит нам об их наследовании.

Если вы хотите, чтобы B.Foo имел атрибуты от A.Foo, вам нужно заставить B.Foo наследовать от A.Foo:

class B(A):
    class Foo(A.Foo):
        bob = False
1 голос
/ 08 апреля 2011

Foo это его собственный класс. Он не наследуется от A. Из-за этого у него нет полей A. Тот факт, что вложен в подкласс A, ничего не меняет.

...