簡體   English   中英

內部類用法python。 全局名稱未定義

[英]Inner class usage python. Global name is not defined

我對python內部類用法有疑問。 我知道這是一個壞習慣,但無論如何。 我想知道定義內部類的范圍。 我收到錯誤消息“未定義全局名稱'ClassName'”。 我的代碼段如下所示: 在此處輸入圖片說明

我發現為了避免出現此錯誤,我可以使用:

ClassWithEnum.EnumClass

代替:

EnumClass

在doSomethingWithEnum()函數內部。 所以我想知道是否有其他方法可以在doSomethingWithEnum()函數內部定義EnumClass? 當我將EnumClass聲明為doSomethingWithEnum()函數的默認參數時,為什么沒有這種錯誤?

class ClassWithEnum(object):
    class EnumClass(object):
        ...

    def doSomethingWithEnum(self, m = EnumClass....):
        ...

Python類構造作為代碼執行。 def語句實際上是正在執行的創建函數的代碼行。 class關鍵字引入一個名稱空間。 將這兩種機制放在一起,就意味着class EnumClass實際上在當前名稱空間中使用該名稱創建了一個對象,與foo = 'bar'所做的操作沒有太大區別,因此可以在同一名稱空間中使用該名稱來引用它,是def語句中發生的事情。

還要比較:

class Foo:
    bar = 'baz'
    print bar
    baz = bar

class塊中的每一行代碼都是常規的可執行代碼行。

完成class定義后,您將退出ClassWithEnum命名空間,並且不能再僅通過該名稱訪問EnumClass了。 現在僅以ClassWithEnum.EnumClass 無論是從類“外部”還是從函數內部(任何函數,包括類方法)。

要訪問該類而無需從方法中鍵入其名稱,可以執行以下操作:

type(self).EnumClass

或者只是self.EnumClass ,因為屬性是在鏈中向上查找的。

當您在doSomethingWithEnum函數中時,您位於其他名稱空間中。 要訪問類中定義的任何內容,例如EnumClass ,應調用self.EnumClass 如果它是類方法, cls.EnumClass

暫無
暫無

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

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