在Python中修补类的所有实例

叔叔

我正在使用Python 3.5.1。我写了一个库,在某些情况下(当文件直接运行时,即__name__ == '__main__'),我想装饰其中一个类中的某些方法。它应该装饰所有可以创建的实例。我想以一种非侵入性的方式来执行此操作,即理想情况下,我的库中的类不需要任何特殊的代码。

一段时间后,我设法实现了这样的东西,可以满足我的要求:

def patch(clazz, name, replacement):

    def wrap_original(orig):
        # when called with the original function, a new function will be returned
        # this new function, the wrapper, replaces the original function in the class
        # and when called it will call the provided replacement function with the
        # original function as first argument and the remaining arguments filled in by Python

        def wrapper(*args, **kwargs):
            return replacement(orig, *args, **kwargs)

        return wrapper

    orig = getattr(clazz, name)
    setattr(clazz, name, wrap_original(orig))

def replacement_function(orig, self, ... other argumnents ...):
    # orig here is the original function, so can be called like this:
    # orig(self, ... args ...)
    pass

patch(mylib.MyClass, 'method_name', replacemment_function)

令人惊讶的是,尽管我尚未使用类方法对其进行测试,但该代码仍然有效,但现在不需要了。它也修补在修补之前创建的实例,尽管我不确定它是否好; d

上面的代码可以说很困难,我需要花一点时间在写完代码后重新整理一下它的工作方式,以便写出解释性注释。我希望轻松一些。

问题是:Python库中是否有任何东西可以使像这样的代码变得不必要了,而这些代码已经实现了我正在做的事情,但是更好呢?

叔叔

这里的一位发帖人可悲地删除了她/他的帖子,将我定向到该functools模块。最后,我决定了以下几点:

def replacement(self, orig, ... other arguments ...):
    # orig here is the original function, so can be called like this:
    # orig(self, ... args ...)
    pass

mylib.MyClass.my_method = functools.partialmethod(replacement, mylib.MyClass.my_method)

切换位置所需origandself参数,因为partialmethod将第一个参数绑定到它所在的实例,结果第二个参数将是原始函数(的第二个参数partialmethod)。看起来更干净。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Python中修补类的所有实例

来自分类Dev

在python中模拟或修补类实例变量?

来自分类Dev

Python实例化模块中的所有类

来自分类Dev

实例化目录中的所有类

来自分类Dev

如何从python类中的实例变量中获取所有值的列表

来自分类Dev

如何在类的__init__方法中修补实例?

来自分类Dev

猴子修补的python类中的自引用

来自分类Dev

使用更改所有实例的静态字段来更改类的所有实例中的字段

来自分类Dev

模拟类的所有实例

来自分类Dev

所有ViewController的类实例

来自分类Dev

使用PHP在目录中创建所有类的实例

来自分类Dev

如何在ruby类中获取所有实例变量?

来自分类Dev

在Scala中实例化所有扩展trait的类

来自分类Dev

定位所有特定类,但SHACL中的指定实例除外

来自分类Dev

在JS脚本中定位Id的所有实例以添加类

来自分类Dev

如何在通用Lisp中获取类的所有实例?

来自分类Dev

有没有一种方法可以在python中为类的所有实例运行方法?

来自分类Dev

有没有一种方法可以在python中为类的所有实例运行方法?

来自分类Dev

是否可以使用现有的Singleton实例修补类实例?

来自分类Dev

在python的类中获取所有常量

来自分类Dev

列出Python类中的所有变量

来自分类Dev

猴子修补python实例方法

来自分类Dev

python-附加到类的单个实例的新项导致所有实例以相同的值更新

来自分类Dev

使用装饰器修补模块中的所有功能

来自分类Dev

使用装饰器修补模块中的所有功能

来自分类Dev

在所有测试中修补多个模块变量

来自分类Dev

jquery可排序类中的TinyMCE实例所有MCE实例

来自分类Dev

将所有类实例的列表存储为类中的静态数组

来自分类Dev

猴子修补从子方法(Python)调用的函数中的类

Related 相关文章

  1. 1

    在Python中修补类的所有实例

  2. 2

    在python中模拟或修补类实例变量?

  3. 3

    Python实例化模块中的所有类

  4. 4

    实例化目录中的所有类

  5. 5

    如何从python类中的实例变量中获取所有值的列表

  6. 6

    如何在类的__init__方法中修补实例?

  7. 7

    猴子修补的python类中的自引用

  8. 8

    使用更改所有实例的静态字段来更改类的所有实例中的字段

  9. 9

    模拟类的所有实例

  10. 10

    所有ViewController的类实例

  11. 11

    使用PHP在目录中创建所有类的实例

  12. 12

    如何在ruby类中获取所有实例变量?

  13. 13

    在Scala中实例化所有扩展trait的类

  14. 14

    定位所有特定类,但SHACL中的指定实例除外

  15. 15

    在JS脚本中定位Id的所有实例以添加类

  16. 16

    如何在通用Lisp中获取类的所有实例?

  17. 17

    有没有一种方法可以在python中为类的所有实例运行方法?

  18. 18

    有没有一种方法可以在python中为类的所有实例运行方法?

  19. 19

    是否可以使用现有的Singleton实例修补类实例?

  20. 20

    在python的类中获取所有常量

  21. 21

    列出Python类中的所有变量

  22. 22

    猴子修补python实例方法

  23. 23

    python-附加到类的单个实例的新项导致所有实例以相同的值更新

  24. 24

    使用装饰器修补模块中的所有功能

  25. 25

    使用装饰器修补模块中的所有功能

  26. 26

    在所有测试中修补多个模块变量

  27. 27

    jquery可排序类中的TinyMCE实例所有MCE实例

  28. 28

    将所有类实例的列表存储为类中的静态数组

  29. 29

    猴子修补从子方法(Python)调用的函数中的类

热门标签

归档