【问题标题】:Can a Python inner class be a subclass of its own outer class?Python 内部类可以是它自己的外部类的子类吗?
【发布时间】:2016-12-28 21:24:45
【问题描述】:

这...

class A(object):
    class B(A):
        def __init__(self):
            pass

...抛出“NameError: name 'A' is not defined”。

是否有适当的语法来完成此操作,或者我必须使用解决方法,例如这样?

class A(object):
    pass
class _B(A):
    pass
A.B = _B

优先级是非常可取的。谢谢。

【问题讨论】:

  • 1.那是一个内部类,而不是子类。 2.不,内部类不能继承(不扩展)其外部类,因为在定义内部类时外部类没有完全定义。 3.您的解决方法不是解决方法,因为它没有内部类。您混淆了子类和内部类。
  • 请注意,在 Python 中,内部类很少有好的用例。
  • 然后我错误地命名了查询。所以这对于内部类是不可能的。是否可以重命名,还是问题无效?
  • @DeepSpace,在答案中说出这句话,我会标记它。否则我会自己回答。

标签: python python-2.7 inheritance subclass


【解决方案1】:

根据 OP 的要求,作为答案发布。

  1. 这是一个内部类,而不是子类。

  2. 不,内部类不能继承(不扩展)其外部类,因为在定义内部类时外部类没有完全定义。

  3. 您的解决方法不是解决方法,因为它没有内部类。你混淆了子类和内部类

【讨论】:

    【解决方案2】:

    您不能以正常方式执行此操作,并且可能不应该这样做。

    对于那些有正当理由尝试类似事情的人,有一种解决方法是在完全定义 A 之后动态更改 A.B 的超类(请参阅 https://stackoverflow.com/a/9639512/5069869)。

    这可能是糟糕的代码,是一个大黑客,不应该这样做,但它在某些条件下有效(请参阅链接答案)

    class T: pass
    class A(object):
      def a(self):
        return "Hallo a"
      class B(T):
        def b(self):
          return "Hallo b"
    A.B.__bases__ = (A,)
    b=A.B()
    assert isinstance(b, A)
    assert b.a()=="Hallo a"
    

    现在你甚至可以做一些奇怪的事情,比如x = A.B.B.B.B()

    【讨论】:

    • 天哪……不过,感谢您提供的工作示例。它阐明了人们必须如何倒退才能实现这一目标。我会以不同的方式处理类结构。
    猜你喜欢
    • 2010-10-24
    • 2011-08-11
    • 2014-09-09
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    相关资源
    最近更新 更多