【问题标题】:Monkey patch a python instance method using the original method from the classMonkey 使用类中的原始方法修补 python 实例方法
【发布时间】:2019-06-24 21:50:24
【问题描述】:

我想修改库类的方法来为参数定义不同的默认值。这失败了:

from functools import partial

class A(object):
    def meth(self, foo=1):
        print(foo)

A.meth = partial(A.meth, foo=2)

a = A()
a.meth()

与:

Traceback (most recent call last):
  File "...", line 10, in <module>
    a.meth()
TypeError: meth() missing 1 required positional argument: 'self'

这样做的正确方法是什么?

(原始代码在循环中的方法名称上使用getattr

链接问题中的答案涉及定义一个新的模块级函数 - 我想避免一个新的函数定义

【问题讨论】:

  • 使用@override?
  • 哦不熟悉@override
  • 忽略我的覆盖语句,这可能是我的大脑混合了一些 Java 语法.. ouff.. 该声明可能只是令人眼花缭乱。对困惑感到抱歉。您应该能够直接替换 A.meth = new_func 并且它应该可以工作。
  • @Mr_and_Mrs_D 注意A.meth 不是一个简单的函数,它是一个描述符。因此,您需要将其替换为实现描述符协议的对象。

标签: python python-3.x monkeypatching


【解决方案1】:

使用partialmethod:

In [32]: from functools import partialmethod

In [33]: A.meth = partialmethod(A.meth, foo=2)

In [34]: a = A()

In [35]: a.meth()
2

【讨论】:

  • 哦! partial 和 partialmethod 有什么区别(不知道后者)
猜你喜欢
  • 2011-12-15
  • 2017-05-24
  • 1970-01-01
  • 2015-03-23
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
相关资源
最近更新 更多