【发布时间】:2013-04-04 06:21:31
【问题描述】:
我有一个相当大且涉及的decorator to debug PyQt signals,我想动态添加到一个类中。有没有办法给类动态添加装饰器?
我可能从错误的角度来处理这个问题,所以这就是我想要完成的。
目标
- 我有一个装饰器,它会发现/附加到类中的所有 pyqt 信号,并在发出这些信号时打印调试。
- 这个装饰器非常适合调试单个类的信号。但是,有时我想将我的所有信号附加到应用程序中。这可用于查看我是否在意外时间发出信号等。
- 我想将此装饰器动态附加到我的所有具有信号的类。
可能的解决方案/想法
到目前为止,我已经考虑了一些可能的解决方案:
- 继承:如果我所有的类都具有相同的基类(除了 Python 的内置
object和 PyQt 的内置QtCore.QObject),这将很容易。我想我可以把这个装饰器附加到我的基类上,一切都会按预期进行。但是,在此特定应用程序中并非如此。我也不想将我的所有类都更改为具有相同的基类。 - Monkey-patch Python
object或QtCore.QObject:我不知道这将如何实际工作。但是,理论上我可以将这些基类之一的__init__更改为我在装饰器中定义的new_init吗?这看起来真的很危险和骇人听闻,但也许这是一个好方法? - 元类:我认为元类不会在这种情况下工作,因为我必须将
__metaclass__属性动态添加到我想要将装饰器注入到的类中。我认为这是不可能的,因为要插入此属性,必须已经构造了该类。因此,我定义的任何元类都不会被调用。这是真的?
我尝试了一些元类魔法的变体,但似乎没有任何效果。我觉得使用元类可能是实现我想要的一种方式,但我似乎无法让它发挥作用。
再一次,我可能会搞错这一切。本质上,我想将上面引用的装饰器中的行为附加到我的应用程序中的所有类(甚至可能是选择类的列表)。此外,如有必要,我可以重构我的装饰器。我真的不在乎我是否将此行为与装饰器或其他机制相结合。我只是假设这个装饰器已经完成了我对单个类的要求,所以它可能很容易扩展。
【问题讨论】:
标签: python pyqt pyqt4 decorator python-decorators