python - 如何获得无界类方法
问题描述
我正在尝试“包装”现有的类方法,即
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
,它存在于我正在修补的另一个代码库中]
解决方案
假设,你有:
>>> 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>
推荐阅读
- ios - 如何使用 react-native 在 IOS 中引用当前视图?
- python-3.x - 如何将函数中的代码重复 N 次而不是重新输入?
- java - 代理对象调用抛出参数类型不匹配
- algorithm - 允许重叠的间隔调度算法
- android - 没有库的圆形 UI 设计中的 Android 文本视图
- powershell - Powershell 从 azure devops 构建管道中获取组件治理结果
- google-oauth - 使用 Passport 和 google oauth2 集成登录时如何重定向
- elixir - 使用受监督的过程防止 exunit 测试中的“GenServer terminating”错误
- c# - C# 时钟中的内存泄漏
- list - 如何检查 CLINGO 列表中的成员资格?