如何在python子类中将重写的父类函数指定为回调函数

时间:2014-11-20 12:39:41

标签: python scrapy

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)

1 个答案:

答案 0 :(得分:0)

您不能仅存储该功能的名称。没有足够的上下文来区分原始方法和覆盖。

您需要存储原始方法(例如,无法覆盖并获取原始函数)或传入使用super()来调用原始文件的不同方法:

def original_test(self):
    return super(B, self).test()
毕竟,

super()并不仅限于当前的方法。

请注意,方法对象.__name__属性将始终返回包装的函数对象.__name__属性,无需为了获取该值而解包该方法。