python之如何获得无限类方法

Free-Thinker 阅读:82 2025-06-02 22:19:02 评论:0

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

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
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号