在Python中,如何在類語句中獲取對當前類對象的引用?例如:我已經註銷如何獲取當前類對象的引用?
def setup_class_members(cls, prefix): setattr(cls, prefix+"_var1", "hello") setattr(cls, prefix+"_var2", "goodbye") class myclass(object): setup_class_members(cls, "coffee") # How to get "cls"? def mytest(self): print(self.coffee_var1) print(self.coffee_var2) x = myclass() x.mytest() >>> hello >>> goodbye
替代品有:
使用
locals()
:這給出了可以寫入到一個類聲明的字典。這似乎適用於類,但文檔告訴你不要這樣做。 (如果有人能向我保證這會繼續工作一段時間,我可能會試着採用這種方法)。在
class
聲明之後向類對象添加成員:我的實際應用是派生一個PyQt4QWidget
類具有動態創建的pyqtProperty
類屬性。QWidget
是不尋常的,因爲它有一個自定義的元類。非常粗略地說,元類編譯一個pyqtProperties
的列表並將其存儲爲額外的成員。因此,創建後添加到類中的屬性不起作用。一個例子來清除此設置:
from PyQt4 import QtCore, QtGui # works class MyWidget1(QtGui.QWidget): myproperty = QtCore.pyqtProperty(int) # doesn't work because QWidget's metaclass doesn't get to "compile" myproperty class MyWidget2(QtGui.QWidget): pass MyWidget2.myproperty = QtCore.pyqtProperty(int)
請注意,以上將用於大多數編程情況下工作;我的情況恰好是這些不尋常的角落案件之一。
mouad的答案絕對是一個必須解決的問題,但要描述發生了什麼:類定義只是在它自己的本地範圍內執行一系列語句。一旦完成後,類名,基類的列表,並且將所得的dict當地人被傳遞到[類型構造](http://docs.python.org/library/functions.html#type)爲'類型( class_name,bases_tuple,locals_dict),然後返回'cls'。因此,'cls'在你想要的位置不可用,只有在之後。此外,使用元類將導致它被調用來代替'type',並且具有相同的簽名。 –
我不知道這事'當地人()'把戲班工作。有趣的一點瑣事。 :-) – kindall