Skip to main content
 首页 » 编程设计

python之如何使用重定义一个方法,在方法中仍然使用原来未修改的继承方法

2025年05月04日14bluestorm

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

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

请您参考如下方法:

如果您只是问“如何从我的 sort 方法调用父类(super class)的 sort 方法,可以使用 super 完成。

例如,如果你只想让 sort 中的 key 在 Python 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 甚至更简单(而且,sort 没有 cmp 参数):

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 更简单,这次是因为未绑定(bind)方法与函数相同:

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