2016-08-22 73 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