2015-11-24 231 views
1

假設您有兩個類AB。類B在類A中定義。我想在內部類中訪問外部類的變量和方法。這裏的代碼是一個玩具的例子,但有什麼我想證明要領:嵌套類:從內部類訪問外部類的方法

class A: 
    a = 'even' 
    b = 'odd' 
    class B: 
    def __init__(self, n): 
     if n%2 == 0: self.num = a 
     if n%2 == 1: self.num = b 
     self.description = A.desc() 

    def __getitem__(self, i): 
    return self.B(i) 

    def desc(self): 
    return a + '-' + b 

>>> c = A() 
>>> d = c[4] 
>>> TypeError: unbound method desc() must be called with A instance as first argument (got nothing instead) 

這裏desc確實在類A的變量的一些工作,併產生輸出的方法。因爲您沒有定義description變量,所以類A已正確初始化,您可以訪問變量ab,即使是從內部作用域也是如此。但是,我找不到調用外部作用域類方法desc的方法。是否可以在B中使用desc方法而不實例化類A

解釋爲什麼我用這樣的模式:在我的程序 變量ab是相當大的。我只需要初始化它們一次。另外,我不希望這些變量浮動在程序中,而只能被內部類訪問。除此之外,我還可以在需要時使用A.__getitem__來提取大數據的'切片'。因此,外部類爲我提供了隱藏/封裝數據,索引操作符(通過__getitem__)以及提取數據片所需的所有例程(這裏的方法desc。內部類B提供了有用信息的捆綁從每個指數的大數據來看,這很可能不是實現所描述任務的最佳設計,我很樂意聽取您對於替代模式的意見

回答

1

我看不到任何理由你可以在這裏使用類,更不用說嵌套類了。無論如何,幾乎從來沒有理由在Python中嵌套類,因爲內部類沒有獲得任何特殊的外部類訪問權限

但是,如果你要允許任何東西,而不實例化對象訪問的方法,你可以把它一類方法:

@classmethod 
def desc(self): 
    return a + '-' + b 

,但我看不出爲什麼你會做任何這一點。此外,這裏沒有任何關閉。

+0

我接受這個答案,因爲'@ classmethod'在很大程度上解決了我的問題。我將術語「封閉」改爲「嵌套」。我做了一個快速搜索,實際上這不是封閉的例子,所以謝謝!我添加了解釋爲什麼我使用這種嵌套模式。 –