無制限クラスメソッドを取得する方法

ピーター:

私は、すなわち、「ラップ」、既存のクラスメソッドにしようとしています

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>

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=25750&siteId=1