也許標題有點誤導,但是我想創建一個簡單的裝飾器來在RPC機制中將某些類方法裝飾爲「允許」,但是我被卡住了一個奇怪的錯誤當試圖訪問類變量(Python 2.7.5)時。檢查下面的代碼:使用裝飾器時,Python類不是全局變量
class myclass():
rpcallowedmethods = []
def __init__(self):
pass
def rpcenabled(fn):
print fn
print globals()
print myclass
@rpcenabled
def somefunc(self,param):
pass
c = myclass()
例外:NameError: global name 'myclass' is not defined
任何人都可以解釋這背後的原因嗎?
編輯: 我在問的是更多的事實,即python執行在類中定義的裝飾器,並運行在裝飾類方法之前甚至在全局類中,所以我相信它更多的是一個邏輯「錯誤「在python實現方面比看似明顯NameError
'rpcenabled'裝飾者沒有任何意義。首先,它不應該被定義在你的類中,其次,'NameError'來自'rpcenabled'調用中的print語句,因爲當裝飾器被執行時(myclass)還沒有定義類對象的_creation_ - 你的類正在被編譯並且不存在)。你的'print globals()'應該向你展示了這一點。你真的想讓裝飾者做什麼? – l4mpi 2014-11-06 13:58:45
我不知道python有這樣一個選擇性解析器,因爲它已經在類的定義中了,我認爲它在執行任何裝飾方法之前必須解析它... – 2014-11-06 14:02:18
那麼,解析器在創建類時基本上就像這樣工作:它創建一個空的類對象,獲取屬於類定義的所有代碼,通過執行所有類級別的語句(創建函數,執行函數裝飾器,分配類變量)填充類對象,將填充的類對象傳遞給任何類裝飾者和_then_將結果分配給surronding範圍中的類的名稱。這項任務是這個過程中的最後一步。在你的具體情況下,只需將你的'rpcallowedmethods'列表傳遞給裝飾器,而不是使用類。 – l4mpi 2014-11-06 14:15:19