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)
你不能,不能只存储函数的名称。那里没有足够的上下文来区分原始方法和重写。
你要么需要存储原始方法(例如,不要伸手去获取原始函数),要么传入使用super()
调用原始方法的不同方法:
def original_test(self):
return super(B, self).test()
毕竟,super()
不仅限于当前的方法。
请注意,方法对象.__name__
属性将始终返回包装的函数对象.__name__
属性,无需解开方法包装即可获得该值。