Наследование и внутренние классы в 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'

3 ответа

Решение

Причина по которой 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 наследуется от А.
  2. nay атрибут, который имеет значение False,
  3. Foo атрибут, который имеет объект класса.

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

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

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

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

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

Другие вопросы по тегам