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: <unbound method Base.payload>
drvd_func: < main .Drvd instance at 0x00B51648>>的绑定方法 Drvd.payload >>
Base:payload

4

3 回答 3

2

您特别要求使用 的基础函数 ( im_func) Base.payload,并im_class使用Drvd. 在现有print的 in之后添加iter

    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——这也是您在调用中观察到的。

除了通过获取名称并使用它来执行(一个实例)或等效项之外,Base.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 回答