繁体   English   中英

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

[英]How to overload numeric operators in Python

我最近正在使用Python,并且想使用另一种查找平方根的方法。 例如,我想用牛顿-拉夫森逼近法找到n的平方根。 我需要重载** (仅当您将数字提高到0.5时) math.sqrt() ,以及math.sqrt()math.sqrt() ,因为我有几个较旧的项目可以通过这样做并替换所有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))

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

长答案:您可以将float子类化,但是它需要对程序的输入值进行额外的编码和重构,使其具有覆盖了运算符和函数的新float类。

并且您可以覆盖math.sqrt ,但是不建议这样做

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

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

如果您真的想重载intfloat对象的语言,则可以使用魔术函数的变体。 为了保持一致,您必须编写很多代码。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM