簡體   English   中英

為什么需要限定局部變量?

[英]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函數無法訪問。 一旦創建了類對象並將其綁定到MyClassfoo成為該類對象的屬性(就像FWIW bar一樣),但這是名稱空間,而不是作用域。

同樣和FWIW一樣,Python的staticmethod訪問類本身。 如果要使用需要訪問該類的方法,請改用classmethod

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM