【问题标题】:Inheritance and inner classes in Python?Python中的继承和内部类?
【发布时间】:2011-08-01 01:17:18
【问题描述】:

在以下代码中,类B 继承了类Ayay 属性,这是我预料到的。我还希望内部类 B.Foo 的行为方式相同,但事实并非如此。

如何让B.Foo从类A继承alice属性?我需要B 中的内部子类Foo 同时具有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'

【问题讨论】:

  • 为什么你认为你需要内部类?我从来没有见过一种情况,他们会想到我作为解决方案。另外,显式继承有什么问题(如class Foo(A.Foo))?
  • 你总是可以在没有内部类的情况下编写等效的解决方案,但有时可以很好地表达代码结构和类关系。想象一个集合和一个迭代器——内部类使用的经典示例(尽管更面向 C++)。

标签: python oop class inheritance inner-classes


【解决方案1】:

B.Foo.alice 报错的原因是A 类的Foo 属性和B 类的Foo 属性之间没有联系。

B 中,属性Foo 有一个类对象值,它完全替换了从A 继承的类对象值。

这应该可以解决它:

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

一般来说,至少对我来说,将类主体内容视为具有特定分配值的属性序列是有帮助的。

对于B 类,我们有:

  1. yay 属性的值 True 继承自 A。
  2. nay 属性值为 False
  3. Foo 具有类对象的属性。

类方法也是具有可调用对象作为值的属性。

【讨论】:

    【解决方案2】:

    继承是每个类的事情。在您的代码中,类B 继承自类A,但仅仅因为它们都具有内部类Foo 并没有告诉我们关于它们的继承的任何信息。

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

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

    【讨论】:

    • 事实上,Python 的最后一个 Zen Koan 专门说“命名空间是一个很棒的想法——让我们做更多的事情!”。 B.Foo 显然与 A.Foo 不同。
    • 在 Python 3 中,class Foo: pass 是它拥有的新样式(唯一样式)类的正确语法。见:docs.python.org/release/3.0.1/reference/…
    • @pavel 你是对的。因此,由于 OP 没有说明使用的是哪个版本,我将删除关于类的部分。
    【解决方案3】:

    Foo 是它自己的类。它不继承自A。因此,它没有A 的任何字段。嵌套在A 的子类中的事实不会改变任何东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-20
      • 2015-12-09
      • 2018-05-19
      • 1970-01-01
      相关资源
      最近更新 更多