如何将被覆盖的父类函数分配为 python 子类中的回调函数


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__属性,无需解开方法包装即可获得该值。

最新更新