我的问题是关于python中的运算符重载。我想设置方法在python中调用的'priority'或'order',我正在寻找一种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__
,以便修改原始对象并复制修改后的对象。我想要的结果是在第二种情况下,但首先,我必须使用()
来分隔首先调用哪个方法,然后再调用哪个方法。
所以我的问题是:如何更改调用这些方法的顺序,可能是在类中,而不是将操作符的调用与实例上的大括号分组?
提前致谢!
答案 0 :(得分:1)
您不能,运算符优先级内置于语言中。我建议不要像这样重载运算符,它只会使编码器更难阅读。
相反,我认为最好的选择就是:
copied = copy.deepcopy(my_obj)(b=77)
(像这样使用__call__()
看起来也很奇怪,但根据情况可能有效。)