Наследование и внутренние классы в 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
, у нас есть:
yay
атрибут, который имеет значениеTrue
наследуется от А.nay
атрибут, который имеет значениеFalse
,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
ничего не меняет.