class Process(object):
def __init__(self, obj, callback):
if obj and hasattr(callback, 'im_self') and callback.im_self is obj:
self.obj = obj
self.callback=callback.im_func.__name__
else:
raise Exception('invalid callback')
class A(object):
def parse(self):
print 'in parse()'
return Process(self, callback=self.test)
def test(self):
print 'in class A'
class B(A):
def test(self):
print 'in class B'
# do something...
return Process(self, callback=super(B, self).test)
b=B()
p=b.parse()
callback = getattr(p.obj, str(p.callback))
p=callback()
callback = getattr(p.obj, str(p.callback))
callback()
程序输出:
in parse()
in class B
in class B
不会调用A.test()
我正在使用Scrapy
,它在Process()中使用这种方式来保存回调函数。如何通过B.test()调用A.test()?
由于评论而更新
你是对的。 A和B都是蜘蛛,A是基础蜘蛛,B有特殊程序,所以想在B.test()之后调用A.test()。必须更改B类,很难修改Scrapy的源代码。
class B(A):
def test_again(self):
return super(B,self).test()
def test(self):
print 'in class B'
return Process(self, callback=self.test_again)
答案 0 :(得分:0)
您不能仅存储该功能的名称。没有足够的上下文来区分原始方法和覆盖。
您需要存储原始方法(例如,无法覆盖并获取原始函数)或传入使用super()
来调用原始文件的不同方法:
def original_test(self):
return super(B, self).test()
毕竟, super()
并不仅限于当前的方法。
请注意,方法对象.__name__
属性将始终返回包装的函数对象.__name__
属性,无需为了获取该值而解包该方法。