如何使用重新定义方法并仍然在方法中使用原始未修改的继承方法?

时间:2013-04-11 00:20:17

标签: python class methods python-3.x

这个问题的措辞很差,但我想不出更好的方法。这也可能是一个简单的问题,但很难正确描述搜索它。我正在用python编写记录。

我正在尝试创建一个继承列表类型的新类。它应该有效地是我定义的另一个类的列表,其中该类的一个变量是int。列表排序后,我希望它根据这些int进行排序。当我在课堂上重新定义排序时,我如何使用列表类型中的原始排序。

2 个答案:

答案 0 :(得分:1)

如果您只是问“我如何使用sort方法调用我的超类sort方法,则使用super完成。

例如,如果您只想将key中的sort默认为{2.7}中的int

class MyList(list):
    def sort(self, cmp=None, key=None, reverse=None):
        if cmp is None and key is None:
            key = int
        return super(MyList, self).sort(cmp, key, reverse)

在3.3中,使用魔法super更简单(并且cmp没有sort参数):

class MyList(list):
    def sort(self, key=None, reverse=None):
        if key is None:
            key = int
        return super().sort(key, reverse)

如果你在调用旧方法的方法中询问如何monkeypatch,那有点棘手......但关键是函数和方法是一等值,所以你可以将它们保存在变量,属性等中

在2.7:

old_sort = MyList.sort
def new_sort(self, cmp=None, key=None, reverse=None):
    if cmp is None and key is None:
        key = int
    return old_sort(self, cmp, key, reverse)
MyList.sort = types.UnboundMethodType(new_sort, None, MyList)

同样,3.3更简单,这次是因为未绑定的方法与函数相同:

old_sort = MyList.sort
def new_sort(self, key=None, reverse=None):
    if key is None:
        key = int
    return old_sort(self, key, reverse)
MyList.sort = new_sort

答案 1 :(得分:0)

如果您确切知道父类具有您要调用的重写方法(我假设在这种情况下分别是listsort),您可以在子类中调用父类的方法,如下所示:

def sort(self, ...):
    ...
    list.sort(self, ...)
    ...