0

私の質問は、Python での演算子のオーバーロードについてです。Pythonでのメソッド呼び出しの「優先度」または「順序」を設定したいのですが、それを行うためのpythonicな方法を探しています。以下は非常に奇妙な例ですが、要点を示していると思います。

オブジェクトのコピーと変更に関するシンタックス シュガーを作成するために、Python で演算子__pos__と演算子をオーバーロードしたいとします。__call__主なアイデアのダミーの実装を次に示します。

import copy

class C(object):
    def __init__(self, **kwargs):
        self._set(**kwargs)

    def __call__(self, **kwargs):
        self._set(**kwargs)
        return(self)

    def __pos__(self):
        return(copy.deepcopy(self))

    def _set(self, **kwargs):
        for keyword, value in kwargs.iteritems():
            setattr(self, keyword, value)

# first case:
my_obj = C(a=12, b=33, c=55)
copied = +my_obj(b=77)
print vars(my_obj), vars(copied)
# >>> {'a': 12, 'c': 55, 'b': 77} {'a': 12, 'c': 55, 'b': 77}

# second case:
my_obj = C(a=12, b=33, c=55)
copied = (+my_obj)(b=77)
print vars(my_obj), vars(copied)
# >>> {'a': 12, 'c': 55, 'b': 33} {'a': 12, 'c': 55, 'b': 77}

ご覧のとおり、最初のケースでは__call__メソッドが最初に呼び出され、次に が呼び出される__pos__ため、元のオブジェクトが変更され、変更されたオブジェクトがコピーされます。私が望む結果は2番目のケースですが、その場合、最初に()どのメソッドが呼び出され、どのメソッドが後に呼び出されるかを区別するために使用する必要がありました。

したがって、私の質問は次のとおりです。インスタンスで演算子の呼び出しを中括弧でグループ化せずに、おそらくクラスでこれらのメソッドを呼び出す順序を変更するにはどうすればよいですか?

前もって感謝します!

4

1 に答える 1

1

できません。演算子の優先順位は言語に組み込まれています。このように演算子をオーバーロードしないことをお勧めします。コーダーが読みにくくなるだけです。

代わりに、最良の選択肢は単純に次のとおりであると主張します。

copied = copy.deepcopy(my_obj)(b=77)

(この__call__()ような使い方も奇妙に見えますが、シナリオによっては有効な場合があります。)

于 2013-05-10T17:11:36.553 に答える