在Python中将一组方法添加到预定义类的实例中

时间:2014-11-24 00:27:24

标签: python matplotlib metaprogramming

对于上下文,我尝试在Collection的{​​{1}}实例上处理鼠标事件。 matplotlib也处理鼠标事件,问题是我是从matplotlib执行此操作,networkx使用matplotlib.pyplot.scatter绘制图表上的节点。我没有修改matplotlib本身,因为我不认为这些功能对matplotlib有用。

我还希望能够选择处理哪些事件,并允许用户选择检测到鼠标事件时会发生什么。因此,例如,如果我想要一些可拖动的东西,我会允许它处理鼠标点击,动作和取消点击事件。但是,如果我想让它只给我一个节点的信息,它只需要处理鼠标点击事件。

matplotlib确实有一个示例here,它将实例包装在Draggable类中,连接到鼠标事件并具有处理行为的函数。在我的情况下,我不知道我想要处理哪些事件,或者我可能没有为每个事件实现回调函数。

正如我现在所看到的,一种选择是创建可以绑定到实例的方法:

import types
import matplotlib.pyplot as plt

def on_click(self, mouse_click_event):
    '''callback on click event, mouse_click_event is passed
    automatically by mpl_connect'''
    pass

node_collection = plt.scatter(...) # Has a lot of arguments, returns a PathCollection
node_collection.on_click = types.MethodType(on_click, node_collection)
node_collection.figure.canvas.mpl_connect('button_press_event',
                                          node_collection.on_click)

我认为制作一系列可以将鼠标事件连接到集合并为回调添加绑定方法而不会发生任何冲突的函数会相对容易。

有更好的方法吗?我已经读过关于类装饰器,元类和抽象基类的内容,但我认为它们不适合我的特定问题。还有其他一些我听不到的东西(或者更有可能是我听说过并且没有用过的东西......)?

0 个答案:

没有答案