Наследование и внутренние классы в Python?

В следующем классе кода 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'

Ответ 1

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

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

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

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

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

В случае класса B мы имеем:

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

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

Ответ 2

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

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

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

Ответ 3

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