Наследование и внутренние классы в 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
ничего не меняет.