向类动态添加装饰器

2024-03-28 10:58:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个相当大且涉及面很广的decorator to debug PyQt signals,我想动态地将其添加到类中。有没有一种方法可以动态地向类中添加装饰器?在

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

目标

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

可能的解决方案/想法

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

  1. 继承:如果我的所有类都有相同的基类(而不是Python的内置object和PyQt的内置QtCore.QObject),那么这就很容易了。我想我可以把这个装饰器附加到我的基类上,这样一切都会如期完成。但是,在这个特定的应用程序中,情况并非如此。我也不想把所有的类都改成具有相同的基类。在
  2. Monkey patch PythonobjectQtCore.QObject:我不知道这实际上是如何工作的。然而,理论上,我可以将这些基类中的一个__init__更改为我在decorator中定义的new_init?这看起来真的很危险,很老套,但也许这是一个好的方法?在
  3. 元类:我认为元类在这种情况下不起作用,因为我必须动态地将__metaclass__属性添加到我想注入decorator的类中。我认为这是不可能的,因为要插入这个属性,类必须已经构造好了。因此,我定义的任何元类都不会被调用。这是真的吗?在

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

再说一次,我可能把这一切都搞错了。实际上,我想将上面引用的decorator中的行为附加到应用程序中的所有类(甚至可能是一个选择类的列表)。另外,如果需要,我可以重构我的装饰器。我真的不在乎是否将此行为附加到装饰器或其他机制。我只是假设这个decorator已经实现了我想要的单个类的功能,所以它可能很容易扩展。在


Tags: 方法debug应用程序信号init情况动态装饰
1条回答
网友
1楼 · 发布于 2024-03-28 10:58:53

装饰器只不过是自动应用的可调用项。要手动应用它,请用decorator的返回值替换该类:

import somemodule

somemodule.someclass = debug_signals(somemodule.someclass)

这会将somemodule.someclass名称替换为返回值debug_signals,我们传递了原始的somemodule.someclass类。在

相关问题 更多 >