ピーター:
私は、すなわち、「ラップ」、既存のクラスメソッドにしようとしています
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
、それは私がパッチ適用てることを、別のコードベースに存在しています]
juanpa.arrivillaga:
あなたが持っている、と仮定します。
>>> 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>