クラスデコレータとメソッドデコレータを一緒にうまく組み合わせようとすると、この現象にぶつかりました。基本的に、メソッドデコレータはメソッドのいくつかをダミー値で特別なものにフラグを立て、クラスデコレータは後に来てその値を後で埋めます。 cow.moo.thing = 5
が動作しない理由はPythonでinstancemethodsに属性を追加する
>>> class cow:
>>> def moo(self):
>>> print 'mooo'
>>> moo.thing = 10
>>>
>>> cow.moo.thing
10
>>> cow().moo.thing
10
>>> cow.moo.thing = 5
AttributeError: 'instancemethod' object has no attribute 'thing'
>>> cow().moo.thing = 5
AttributeError: 'instancemethod' object has no attribute 'thing'
>>> cow.moo.__func__.thing = 5
>>> cow.moo.thing
5
簡略化した例である誰もがcow.moo.thing
はかなり明確に私に10を与えるにもかかわらず、知っていますか?そして、なぜcow.moo.__func__.thing = 5
が機能するのですか?私はそれがなぜ起こっているのか分かりませんが、無作為に何かを手に入れようとしているdir(cow.moo)
のリストで突然それをやっていました。
ああ、私は知らなかった。ありがとう! –
古いポストをリバイブしていますが、Python3で 'cow()。moo.thing = 5'が' AttributeError: 'method'オブジェクトに属性 'thing'がありません。なぜなのかご存知ですか ? –
@JacquesGaudinインスタンス( 'cow()。moo')では、関数はPythonのどのバージョンのメソッドオブジェクトにもラップされます。違いはクラス(' cow.moo')上です。ラッピングは 'self'が自動的に関数に渡されるために必要です。 – agf