首页 > 解决方案 > 如何获得无界类方法

问题描述

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

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,如何获取函数的未绑定版本bar

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

标签: pythonpython-3.x

解决方案


假设,你有:

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

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

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

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

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

推荐阅读