簡體   English   中英

在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.

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