[英]Dynamically add member function to an instance of a class in Python
[英]In python ,how to add class member function pointer in class member?
好吧,這就是問題所在,我有一個這樣的班級
Class MyClass(GuiWidget):
def __detectWhichItemClicked(self):
pass
def __handleRightClickItem1(self):
pass
def __handleRightClickItem2(self):
pass
def __handleRightClickItem3(self):
pass
def __handleRightClickItem4(self):
pass
__detectWhichItemClicked是用於檢查單擊了哪個項目的函數,如果單擊了其他項目,則會觸發不同的過程,__ handleRightClickItem *函數中實現了不同的過程。 當代碼更新時,可能會添加新的__handleRightClickItem *函數。
因此,通過這種方式,我想將__handleRightClickItem *的“函數指針”指向一個字典,如果該字典歸MyClass實例所有,則每個MyClass實例將獲得一個副本,這可能會浪費內存。 我如何將這些東西添加到類成員並在__detectWhichItemClicked這樣的實例方法中分派__handleRightClickItem *。
我可能想像這樣實現它:
class MyClass:
functionMap = {
"ITEM1": __handleRightClickItem1, //how can i add instance method to class member
"ITEM2": __handleRightClickItem2,
"ITEM3":....
};
def __detechWhichItemClicked(self):
itemName = getItemName()
if itemName in self.__class__.functionMap.keys():
self.__class__.functionMap[itemName](arg)
Problay我更喜歡像以前那樣暗示,但是,這也許不是那么優雅,有人可以展示如何解決這個問題嗎?
更新 :無法獲取所需的語法,因為self.__class__.functionMap[itemName]
無法知道它應在哪個實例上運行。 但是,如果顯式地傳遞self
,則可以非常接近:
class MyClass:
def __detectWhichItemClicked(self):
itemName = getItemName()
if itemName in self.functionMap:
# Pass self into the call
self.functionMap[itemName](self, arg)
...
# This goes after the __handle methods are defined.
functionMap = {
"ITEM1": __handleRightClickItem1,
...
}
# Equivalent.
getattr(obj, "foo")(arg)
getattr(MyClass, "foo")(obj, arg)
obj.foo(arg)
MyClass.foo(obj, arg)
# Also equivalent
bound_method = obj.foo # or getattr(obj, "foo")
bound_method(arg)
# Still equivalent
unbound_method = MyClass.foo # or getattr(MyClass, "foo")
unbound_method(obj, arg)
我不確定要使用哪個選項,但這是Python提供的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.