Python中的继承和内部类?

22 投票
3 回答
15165 浏览
提问于 2025-04-16 15:18

在下面的代码中,类 B 从类 A 继承了 yay 这个属性,我对此是有预期的。我还希望内部类 B.Foo 也能以同样的方式工作,但实际上并不是这样。

我该如何让 B.Foo 从类 A 继承 alice 这个属性呢?我需要内部子类 FooB 中同时拥有 alicebob 这两个属性。

谢谢。

>>> 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 个回答

1

Foo 是它自己的一个类。它并没有从 A 这个类继承。因此,Foo 并没有 A 类的任何属性。即使 Foo 被放在 A 的一个子类里面,这也不会改变什么。

9

继承是针对每个类来说的。在你的代码中,类 B 是从类 A 继承而来的,但仅仅因为它们都有内部类 Foo,并不能说明它们之间的继承关系。

如果你想让 B.Foo 拥有 A.Foo 的属性,你需要让 B.Foo 继承自 A.Foo

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

你看到的错误是因为类 AFoo 属性和类 BFoo 属性之间没有联系。

在类 B 中,Foo 属性的值是一个类对象,这个值完全覆盖了从 A 继承来的 Foo 属性的值。

这样做应该能解决问题:

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

一般来说,至少对我来说,把类的内容想象成一系列带有特定值的属性会比较有帮助。

以类 B 为例,我们有:

  1. yay 属性,它的值是从 A 继承来的 True
  2. nay 属性,它的值是 False
  3. Foo 属性,它的值是一个类对象。

类的方法也是属性,它们的值是可以调用的对象。

撰写回答