这个问题的措辞很糟糕,但我想不出更好的表达方式。这也可能是一个简单的问题,但很难正确描述来搜索它。我正在用python编码以供记录。
我正在尝试创建一个继承列表类型的新类。它应该实际上是我定义的另一个类的列表,其中该类的变量之一是 int。对列表进行排序后,我希望它根据这些整数进行排序。当我在类上重新定义排序时,我如何使它使用来自列表类型的原始排序。
这个问题的措辞很糟糕,但我想不出更好的表达方式。这也可能是一个简单的问题,但很难正确描述来搜索它。我正在用python编码以供记录。
我正在尝试创建一个继承列表类型的新类。它应该实际上是我定义的另一个类的列表,其中该类的变量之一是 int。对列表进行排序后,我希望它根据这些整数进行排序。当我在类上重新定义排序时,我如何使它使用来自列表类型的原始排序。
如果你只是问“我如何sort
从我的方法中调用我的超类的方法sort
,那是使用super完成的。
例如,如果您只想将key
insort
默认设置为int
Python 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
如果你确切地知道哪个父类有你想要调用的重写方法(我假设在这种情况下它分别是list
和sort
),你可以像这样在子类中调用父类的方法:
def sort(self, ...):
...
list.sort(self, ...)
...