python - 重载 + 以支持元组

标签 python operator-overloading tuples

我希望能够用 python 编写这样的东西:

a = (1, 2)
b = (3, 4)
c = a + b # c would be (4, 6)
d = 3 * b # d would be (9, 12)

我知道您可以重载运算符以处理自定义类,但有没有办法重载运算符以处理对?

当然有这样的解决方案

c = tuple([x+y for x, y in zip(a, b)])

确实有效,但是撇开性能不谈,它们不如重载 + 运算符那么漂亮。

当然可以定义addmul 函数,例如

def add((x1, y1), (x2, y2)):
    return (x1 + x2, y1 + y2)

def mul(a, (x, y)):
    return (a * x, a * y)

但仍然能够编写 q * b + r 而不是 add(times(q, b), r) 会更好。

想法?

编辑:附带一提,我意识到由于 + 目前映射到元组连接,重新定义它可能是不明智的,即使它是可能的。该问题仍然适用于 - 例如 =)

最佳答案

与 Ruby 不同,您无法更改 Python 中内置类型的行为。您所能做的就是从内置类型派生 创建一个新类型。不过,文字仍会创建内置类型。

可能你能得到的最好的是

class T(tuple):
    def __add__(self, other):
        return T(x + y for x, y in zip(self, other))
    def __rmul__(self, other):
        return T(other * x for x in self)
a = T((1, 2))
b = T((3, 4))
c = a + b # c would be (4, 6)
d = 3 * b # d would be (9, 12)

关于python - 重载 + 以支持元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5802020/

相关文章:

python - 将命令重定向到 Python 中另一个的输入

python - 选择列表中下一个元组的命令

Python从列表到元组的转换

c++ - 将 std::tuple 转换为模板参数包

python - 为什么 Python 代码在函数中运行得更快?

python - 使用 SQLAlchemy 使用 SQL 表本身的数据更新 SQL 表

javascript - Python 脚本无法保存连接器 - Enterprise Architect

c++ - 将 '>>' 与自己的类(class)交友

c++ - 重载运算符<<

c++派生类中的重载方法