2

その質問は言葉遣いが下手でしたが、それ以上の言い方が思い浮かびませんでした。これもおそらく簡単な質問ですが、検索するために適切に説明するのは困難です。記録のためにPythonでコーディングしています。

リスト型を継承する新しいクラスを作成しようとしています。それは事実上、私が定義した別のクラスのリストであり、そのクラスの変数の 1 つが int であるはずです。リストがソートされるとき、それらのintに基づいてソートしたい。クラスでソートを再定義するとき、リストタイプから元のソートを使用する方法。

4

2 に答える 2

1

sort「自分のメソッドから自分のスーパークラスのメソッドを呼び出すにはどうすればよいか」と尋ねているだけなら、それはsupersortを使用して行われます。

たとえば、Python 2.7 でkeyin を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 では、マジックを使用するとさらに簡単になりますsuper(また、cmpへのパラメーターはありませんsort)。

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

古いメソッドを呼び出すメソッドにモンキーパッチを適用する方法を尋ねている場合、それは少しトリッキーです...しかし重要なのは、関数とメソッドはファーストクラスの値であるため、それらを変数、属性などに保存できるということです.

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 に答える