[英]Why do I need to qualify local variables?
在本課程中:
class MyClass () :
foo = 1
@staticmethod
def bar () :
print MyClass.foo
為什么我需要使用MyClass
來限定foo
? (否則我得到NameError: global name 'foo' is not defined
。
foo
不是MyClass
類的本地對象嗎?
這是因為Python的范圍查找順序是LEGB(本地,封閉函數,全局,內置)。 此答案中有更多詳細信息。 Python有一個顯式的類變量,它是方法的第一個參數,通常稱為self
。 通常,可以使用self.foo
訪問foo
,但是在這種情況下,該函數是靜態方法,因此它不會收到顯式的類變量,因此沒有替代方法可以訪問foo
。 刪除對foo
的引用或從bar()
刪除@staticmethod
裝飾器,然后將self
添加為bar()
的第一個參數。
您需要這樣做,因為bar函數是靜態方法。 這意味着您可以在不考慮包含類實例的情況下調用它。 IE,您無需創建類的實例即可訪問該功能。
您可以在文檔中了解更多信息
這稱為類屬性,可以由MyClass.foo
直接訪問,並由該類擁有。 它不屬於該類的實例
對於self
這是實例變量,類的每個實例都有一個變量的新副本
在Python中,“局部變量”的概念實際上完全存在於函數中。 類內部的函數(方法)不能隱式訪問該類(或實例)的范圍。 您必須顯式指定包含所需屬性的對象,即類或實例(按照慣例作為self
傳遞給該方法)。 至於為什么這樣設計……您不得不問Guido,但是Python的Zen說“顯性比隱式更好”,因此可能與它有關。
foo不是MyClass類的本地對象嗎?
其實沒有 它在class
語句的主體本地, bar
函數無法訪問。 一旦創建了類對象並將其綁定到MyClass
, foo
成為該類對象的屬性(就像FWIW bar
一樣),但這是名稱空間,而不是作用域。
同樣和FWIW一樣,Python的staticmethod
訪問類本身。 如果要使用需要訪問該類的方法,請改用classmethod
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.