0

次の例では、types.MethodType(...)を介してメソッドオブジェクトをバインドしようとしています。うまくいかないようです。助言がありますか?前もって感謝します。

import types

class Base:
    def payload(self, *args): 
        print "Base:payload"

class Drvd(Base):
    def iter(self, func):
        derived_func = types.MethodType(func, self, Drvd) # bind
        print "drvd_func:", derived_func 
        derived_func() # result:  calls Base:payload 
                       # expected:calls Drvd:payload; why???
    def payload(self, *args):
        print "Drvd:payload"

derived   = Drvd()           
base_func = Base.payload      
print "base_func:", base_func
derived.iter(base_func)  # pass unbound method object

出力は次のとおりです。

base_func:<非バインドメソッドBase.payload>
drvd_func:<バインドされたメソッドDrvd.payload of < main .Drvd instance at 0x00B51648 >>
Base:payload

4

3 に答える 3

2

の偽物を使用して、基になる関数 ( im_func) の使用を具体的に要求しています。既存のinの後に追加:Base.payloadim_classDrvdprintiter

    print "w/class:", derived_func.im_class
    print "w/func:", derived_func.im_func

総出力は次のようになります。

$ python bou.py 
base_func: <unbound method Base.payload>
drvd_func: <bound method Drvd.payload of <__main__.Drvd instance at 0x24a918>>
w/class: __main__.Drvd
w/func: <unbound method Base.payload>
Base:payload

つまり、あなたが尋ねたように、使用されている基礎となるコードは確かにBase.payload- 呼び出しで観察したものでもあります。

名前を取得し、それを使用してon (インスタンス) または同等の操作を行う以外に、 fromBase.payloadに直接アクセスする方法はありません。Drvd.payloadgetattrselfDrvd

于 2009-11-19T19:40:24.117 に答える
1

Base のペイロード (Drvd ではなく) を iter に渡したからです!

ヒント:

print "%s: Base:payload"%repr(self)

とはいえ、呪われたキメラを作成したことには称賛を!

于 2009-11-19T19:34:25.843 に答える
0

あなたが何をしようとしているのかよくわかりませんが、私にとっては期待どおりに機能しています。Base.payload を Drvd にバインドしています。印刷物から、Drvd インスタンスに正しくバインドされていることがわかります。Drvd.payload を呼び出すことを期待している理由がわかりません。関数オブジェクト Base.payload をバインドしています。それは常にその機能になるでしょう。

[編集: 追加するだけです。何をしようとしているのかを一般的な言葉で説明していただけると助かります。現時点であなたがしていることはあまり意味がありません.Pythonには継承があるため、ペイロードメソッドをオーバーライドしたい場合はそれを行うことができます-手動バインディングを行う必要はありません.]

于 2009-11-19T19:36:28.540 に答える