私の質問は、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番目のケースですが、その場合、最初に()
どのメソッドが呼び出され、どのメソッドが後に呼び出されるかを区別するために使用する必要がありました。
したがって、私の質問は次のとおりです。インスタンスで演算子の呼び出しを中括弧でグループ化せずに、おそらくクラスでこれらのメソッドを呼び出す順序を変更するにはどうすればよいですか?
前もって感謝します!