2

这个问题的措辞很糟糕,但我想不出更好的表达方式。这也可能是一个简单的问题,但很难正确描述来搜索它。我正在用python编码以供记录。

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

4

2 回答 2

1

如果你只是问“我如何sort从我的方法中调用我的超类的方法sort,那是使用super完成的。

例如,如果您只想将keyinsort默认设置为intPython 2.7:

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参数 to 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
于 2013-04-11T00:26:21.777 回答
0

如果你确切地知道哪个父类有你想要调用的重写方法(我假设在这种情况下它分别是listsort),你可以像这样在子类中调用父类的方法:

def sort(self, ...):
    ...
    list.sort(self, ...)
    ...
于 2013-04-11T00:25:07.907 回答