python - 如何获得无限类方法

标签 python python-3.x

我正在尝试“包装”现有的类方法,即

def Foo:
  @classmethod
  def bar(cls, x): return x + 2

old_bar = Foo.bar

def wrapped_bar(cls, x):
  result = old_bar(cls, x) # Results in an error
  return result

Foo.bar = wrapped_bar

Foo.bar 似乎已经与 cls = Foo 绑定(bind),如何获取函数 bar 的未绑定(bind)版本?

[我不允许修改 Foo,它存在于我正在修补的另一个代码库中]

最佳答案

假设,你有:

>>> class Foo:
...     @classmethod
...     def bar(cls, x):
...         return x*42
...
>>> Foo.bar(2)
84

然后一种方法是直接访问类的 namespace 。然后您应该能够访问 classmethod 对象并获得在 __func__ 属性中可用的修饰函数:

>>> vars(Foo)['bar']
<classmethod object at 0x103eec520>
>>> vars(Foo)['bar'].__func__
<function Foo.bar at 0x1043e49d0>

或者,它可以在绑定(bind)方法对象本身上访问:

>>> bound = Foo.bar
>>> bound
<bound method Foo.bar of <class '__main__.Foo'>>
>>> bound.__func__
<function Foo.bar at 0x1043e49d0>

关于python - 如何获得无限类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60533691/

相关文章:

python - 从 Python 调用 Excel 用户定义函数总是返回 None

python-3.x - 在 ffmpeg 命令上映射 3 个或更多输出

python - 将字符串转换为 f 字符串

python - 如何在PyQt中制作双箭头按钮

python - pip 路径 : anaconda vs. native python(在 macOS 上)

python - 如何安装 Python 3.6 和 Python 2.7?

python - socketserver - 允许重用地址重新绑定(bind)现有端口号在不覆盖类变量的情况下不起作用

python - Tensorflow,多标签准确率计算

python - 有没有办法在 PySide 或 PyQt 中向 QListView 添加部分?

python - 使用netstat -lntp 检测监听端口的进程是否关闭时netstat 出现异常?