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

Python 如何使用重定义方法并在方法中仍然使用原始的未修改的继承方法?,python,class,methods,python-3.x,Python,Class,Methods,Python 3.x,那个问题措辞拙劣,但我想不出更好的表达方式。这可能也是一个简单的问题,但很难用恰当的描述来搜索它。我正在用python编写记录 我正在尝试创建一个继承列表类型的新类。它实际上应该是我定义的另一个类的列表,其中该类的一个变量是int。当列表被排序时,我希望它根据这些int进行排序。当我在类上重新定义sort时,如何使它使用列表类型的原始sort。如果您确切知道哪个父类具有要调用的重写方法(我假设在本例中分别是list和sort),则可以在子类中调用父类的方法,如下所示: def sort(self

那个问题措辞拙劣,但我想不出更好的表达方式。这可能也是一个简单的问题,但很难用恰当的描述来搜索它。我正在用python编写记录


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

如果您确切知道哪个父类具有要调用的重写方法(我假设在本例中分别是
list
sort
),则可以在子类中调用父类的方法,如下所示:

def sort(self, ...):
    ...
    list.sort(self, ...)
    ...
如果您只是问“如何从我的
sort
方法中调用我的超类的
sort
方法,那么使用

例如,如果您只想在Python 2.7中将
sort
中的
键设置为默认值
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中,使用magic
super
(而且,没有
cmp
参数进行排序
)更简单:


如果你问如何在一个调用旧方法的方法中进行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

这个问题似乎仍然模棱两可。试着把它缩减为一句话(粗体)。这样我们就更容易回答您的问题。如果您只是问“如何在我的超类
中调用相同名称的方法,请参见[
super`])。
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