在python函数中类似地使用运算符重载

时间:2013-12-17 06:14:42

标签: python

有没有办法在运算符重载中使用变量。 例如

a += 1

而不是a = a + 1

a = max(a, some_other_variable)

max()函数只是一个例子。


注意: 我的意图是尽可能不再使用变量'a'。这两个例子是不同的,彼此没有关系。 例如

a = some_function(a, b)

这里,some_function()返回的值再次分配回变量'a'。 除非变量'a'是一个类变量,否则我无法访问函数some_function()中的变量,虽然如果有办法让我只能使用它一次?

3 个答案:

答案 0 :(得分:2)

您无法直接在Python代码中补充Python的运算符和语句集。但是,您可以编写一个使用Python language services编写Pythonesque DSL的包装器,其中包含您想要的运算符。

答案 1 :(得分:2)

我觉得你想要这些东西......

>>> class Foo(object):
...     def __iadd__(self, other):
...         return max(self.num, other)
...     def __init__(self, num):
...         self.num = num
... 
>>> a = Foo(5)
>>> a += 4
>>> print a
5
>>> a = Foo(4)
>>> a += 6
>>> a
6

但请注意,我会认为__iadd__的使用非常不礼貌。如果类型是可变的,那么__iadd__返回self以外的其他内容通常是不重要的。

答案 2 :(得分:0)

您可以为第二部分创建类似于部分的对象,而不是像其他答案一样在a中重载运算符。 (我使用左移操作符“酷”)

class partial(functools.partial):
    def __rlshift__(self, val):
        return self(val)

并使用如下:

>>> a = 10
>>> a <<= partial(max, 20)
>>> a
20

因此,您无需乱用变量类型来执行操作。此外,您不需要为每个函数声明一个新类。

PS:请注意实际执行是max(20, a)