Inheritance and inner classes in Python?
Solution 1
The reason why B.Foo.alice
gave you an error is because there's no connection between Foo
attribute of class A
and Foo
attribute of class B
.
In B
, attribute Foo
has a class object value that completely replaces class object value inherited from A
.
This should fix it:
class B(A):
nay = False
class Foo(A.Foo):
bob = False
In general, it helps, at least for me, to think of a class body contents as a sequence of attributes with certain assigned values.
In case of class B
, we have:
yay
attribute that has valueTrue
inherited from A.nay
attribute that has valueFalse
.Foo
attribute that has class object.
Class methods are also attributes that have callable objects as values.
Solution 2
Inheritance is a per-class thing. In your code class B
inherits from class A
, but just because both of them have inner class Foo
doesn't tell us anything about their inheritance.
If you want B.Foo
to have the attributes from A.Foo
, you need to make B.Foo
inherit from A.Foo
:
class B(A):
class Foo(A.Foo):
bob = False
Solution 3
Foo
is it's own class. It does not inherit from A
. Because of this, it does not have any fields of A
. The fact that is nested in a subclass of A
does not change anything.
![Paolo](https://i.stack.imgur.com/nHYpZ.jpg?s=256&g=1)
Paolo
Enthusiast software developer. Self reminders I'm here to learn. Learning is an experience, everything else is just information. (A.Einstein)
Updated on June 06, 2022Comments
-
Paolo about 2 years
In the following code class
B
has inheritedyay
attribute from classA
, I expected this. I'd also expect that inner classB.Foo
behaves the same way but it doesn't.How to make
B.Foo
to inheritalice
attribute from classA
? I need that the inner subclassFoo
inB
has both the attributesalice
andbob
.Thanks.
>>> 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'
-
Adriano Varoli Piazza about 13 yearsIn fact, Python's last Zen Koan specifically says "Namespaces are one honking great idea -- let's do more of those!". B.Foo is then obviously different from A.Foo.
-
Pavel Repin about 13 yearsIn Python 3,
class Foo: pass
is the correct syntax for new style (the only style) classes it has. See: docs.python.org/release/3.0.1/reference/… -
pajton about 13 years@pavel You're right. So since the OP didn't say which version is using I will remove section about classes.