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