0

好吧,这就是问题所在,我有这样的课

Class MyClass(GuiWidget):

   def __detectWhichItemClicked(self):
      pass

   def __handleRightClickItem1(self):
      pass

   def __handleRightClickItem2(self):
      pass

   def __handleRightClickItem3(self):
      pass

   def __handleRightClickItem4(self):
      pass

__detectWhichItemClicked是检查哪个item被点击的函数,如果点击不同的item会触发不同的进程,不同的进程在__handleRightClickItem*函数中实现。当代码更新时,可能会添加新的 __handleRightClickItem* 函数。

所以通过这种方式,我想将__handleRightClickItem*的“函数指针”指向一个dict,如果这个dict由MyClass实例拥有,那么每个MyClass实例都会得到一个副本,这可能会浪费内存。如何将这些东西添加到类成员并在实例方法中调度 __handleRightClickItem*,例如 __detectWhichItemClicked。

我可能想像这样实现它:

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)

可能我更喜欢它像以前一样隐含,但是,这可能不是那么优雅,有人可以展示如何解决这个问题吗?

4

1 回答 1

1

更新:没有办法得到你想要的语法,因为没有办法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 提供的。

于 2013-07-20T01:00:37.360 回答