2012-10-23 73 views
9

所以我有一個類,我用它作爲本地命名空間。我在類中有一些靜態函數,但他們無法訪問類作用域變量。爲什麼是這樣?如何在沒有自我的情況下訪問類作用域變量?

class Foo: 
    foo_string = "I am a foo" 

    @staticmethod 
    def foo(): 
     print foo_string 

>>> Foo.foo() 
    [Stack Trace] 
    NameError: global name 'foo_string' is not defined 

有什麼想法?

回答

10

Python沒有讓類變量落入這一範圍的方式,有兩種方法可以做到這一點,首先是使用類方法:

@classmethod 
def foo(cls): 
    print(cls.foo_string) 

這我認爲是最好的解決方案。

二是要訪問的名字:

@staticmethod 
def foo(): 
    print(Foo.foo_string) 

請注意,在一般情況下,使用類作爲名稱空間是不是做的最好的方法,只要使用具有頂級功能的模塊相反,因爲這種行爲更符合你的要求。

這樣的範圍缺乏的原因主要是由於Python的動態性,當您向類中插入函數時它將如何工作?它必須有條件地添加特殊行爲,這對實施來說是非常尷尬的並且可能是脆弱的。它還有助於保持事物的顯式而不是隱式 - 清楚什麼是類變量而不是局部變量。

+0

使用模塊作爲名稱空間的+1。 –

+1

在3.x類編譯中,引用'__class__'的任何函數都變成了閉包。 '__class__'的單元格由新的'__build_class__'內置函數設置。 'staticmethod'從3.x中移除,所以在類中定義的普通函數可以引用'__class__'。 – eryksun

+0

@DanielRoseman我沒有使用模塊作爲命名空間的主要原因是我嵌套了嵌套命名空間的類,管理如此之多的小文件是很難操作的。 – Lucretiel

相關問題