如何在Python中重载数字运算符

时间:2017-04-16 20:17:04

标签: python operator-overloading

我最近使用Python并希望使用另一种方法来查找平方根。例如,我想用Newton-Raphson近似找到n的平方根。我需要重载**的重载(仅当你将数字提高到0.5时),o perator以及math.sqrt(),因为我有几个较旧的项目可以通过这样做来加速具有其他功能的所有math.sqrt()**(0.5)都不理想。

这可以用Python完成吗?

是否可能超载**math.sqrt

任何有用的链接也非常感谢。

def Square_root(n):
    r = n/2
    while(abs(r-(n/r)) > t):
        r = 0.5 * (r + (n/r))
    return r

print(2**(0.5)) ## changes to print(Square_root(2))
print(math.sqrt(2)) ## that also becomes print(Square_root(2))

2 个答案:

答案 0 :(得分:1)

简而言之:您无法更改内置类型__pow__的行为。

答案很长:你可以继承float,但它需要对程序的输入值进行额外的编码和重构,以及覆盖了运算符和函数的新float类。

您可以覆盖math.sqrt,但这不是推荐

import math
math.sqrt = lambda x, y: print(x, y)
math.sqrt(3, 2)
# 3 2

这将要求自定义函数具有相同的签名。

答案 1 :(得分:1)

如果您真的想要重载语言 int float 对象 - 您可以使用magic functions的变体。为了保持一致,你必须编写很多代码。

很多工作。 Python适合懒惰的人 - 如果你想写很多东西,坚持使用Java或C ++:)