8

我有一个相当大且涉及的装饰器来调试我想动态添加到类中的 PyQt 信号。有没有办法动态地将装饰器添加到类中?

我可能从错误的角度来处理这个问题,所以这就是我想要完成的。

目标

  1. 我有一个装饰器,它将发现/附加到类中的所有 pyqt 信号并在发出这些信号时打印调试。
  2. 这个装饰器非常适合调试单个类的信号。但是,有时我想将我的所有信号附加到应用程序中。这可用于查看我是否在意外时间发出信号等。
  3. 我想动态地将这个装饰器附加到我所有有信号的类上。

可能的解决方案/想法

到目前为止,我已经考虑了一些可能的解决方案:

  1. 继承:如果我所有的类都具有相同的基类(除了 Python 的 built-inobject和 PyQt 的 built-in QtCore.QObject),这将很容易。我想我可以把这个装饰器附加到我的基类上,一切都会按预期进行。但是,在此特定应用程序中并非如此。我也不想将我所有的类都更改为具有相同的基类。
  2. Monkey-patch PythonobjectQtCore.QObject:我不知道这将如何实际工作。但是,理论上我可以将这些基类之一更改__init__new_init我在装饰器中定义的吗?这似乎真的很危险和hackish,但也许这是一个方法?
  3. 元类:我认为元类在这种情况下不会起作用,因为我必须动态地将__metaclass__属性添加到我想将装饰器注入到的类中。我认为这是不可能的,因为要插入此属性,必须已经构造了该类。因此,我定义的任何元类都不会被调用。这是真的?

我尝试了一些元类魔法的变体,但似乎没有任何效果。我觉得使用元类可能是实现我想要的一种方式,但我似乎无法让它发挥作用。

再说一次,我可能做错了。本质上,我想将上面引用的装饰器中的行为附加到我的应用程序中的所有类(甚至可能是选择类的列表)。此外,如有必要,我可以重构我的装饰器。我真的不在乎我是否将此行为与装饰器或其他机制相结合。我只是假设这个装饰器已经完成了我对单个类的要求,所以它可能很容易扩展。

4

1 回答 1

9

装饰器只不过是自动应用的可调用对象。要手动应用它,请将类替换为装饰器的返回值:

import somemodule

somemodule.someclass = debug_signals(somemodule.someclass)

这会将名称替换为我们传递给原始类somemodule.someclass的返回值。debug_signalssomemodule.someclass

于 2013-04-11T21:33:41.627 回答