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__,因此修改了原始对象,并复制了修改后的对象。我想要的结果是在第二种情况下,但在这种情况下,首先我必须使用()来区分首先调用哪个方法,然后调用哪个方法。

所以我的问题是:我怎样才能改变调用这些方法的顺序,可能在类中,而不用实例上的大括号分组运算符的调用?

提前致谢!

4

1 回答 1

1

你不能,运算符优先级是内置在语言中的。我建议不要像这样重载运算符,它只会使编码器更难阅读。

相反,我认为最好的选择就是:

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

(这样使用__call__()看起来也很奇怪,但根据场景可能有效。)

于 2013-05-10T17:11:36.553 回答