2016-08-22 72 views
0

这...Python的内部类可以是它自己的外部类的子类吗?

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

...抛出 “NameError:名字 'A' 没有定义”。

是否有正确的语法来完成这项工作,还是必须使用变通方法?

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

以前是强烈优选的。谢谢。

+7

1这是一个内部类,而不是一个子类。 2.不,内部类不能继承(不扩展)它的外部类,因为外部类在定义内部类时没有完全定义。 3.您的解决方法不是解决方法,因为它没有内部类。你混淆了子类和内部类。 – DeepSpace

+0

请注意,在Python中,内部类很少有很好的用例。 –

+0

然后我错误地查询了这个查询。所以这对内心阶层来说是不可能的。是否有可能重命名这个问题,还是问题无效? – ca2longoria

回答

1

根据OP的要求,张贴为答案。

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

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

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

1

你不能这样做的正常方式,可能不应该这样做。

对于那些有充分理由尝试类似的人,通过在完全定义A(请参阅https://stackoverflow.com/a/9639512/5069869)后动态更改A.B的超类有一个解决方法。

这可能是可怕的代码,一个大黑客,不应该做的,但它的工作原理在一定条件下(见链接答案)

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()

+0

噢,好主...感谢你的工作例子,但。它阐明了人们为了实现这个目标必须采取多么落后的行动。我将以不同的方式处理课程结构。 – ca2longoria

+1

如果有人这样做,我希望他们好运调试:) – DeepSpace