如何在python中更改方法调用顺序?

时间:2013-05-10 17:06:45

标签: python oop methods operator-overloading

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

所以我的问题是:如何更改调用这些方法的顺序,可能是在类中,而不是将操作符的调用与实例上的大括号分组?

提前致谢!

1 个答案:

答案 0 :(得分:1)

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

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

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

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