【发布时间】:2019-05-08 07:31:56
【问题描述】:
我目前正在实现一个可以处理与物理单位相关的数字数据的类。
我想实现一种计算实例平方根的方法。假设您有一个具有属性值和名称的类的实例:
from math import sqrt
class Foo:
def __init__(self, value, name)
self.value = value
self.name = name
def __sqrt__(self):
return sqrt(self.value)
我想实现一个类似于 add(self, other) 之类的魔术方法的函数,它会在我调用 math.sqrt() 函数时计算平方根:
A = Foo(4, "meter")
root = math.sqrt(A)
应该返回调用 A.sqrt() 函数。
【问题讨论】:
-
math.sqrt只是许多其他函数之一,Python 显然不能为所有这些函数提供 dunder 方法 -
我怀疑必须有 some 方法让 sqrt 接受自定义类实例。否则,
math.sqrt(numpy.array([4]))是如何工作的? -
之所以有效,是因为
float(numpy.array([4]))有效。如果您可以使用__float__返回一个值,那么 math.sqrt 将返回该值的平方根。 -
@wowserx,所以如果你实现了
Foo.__float__,那么math.sqrt(Foo(4, "meter"))可以执行成功吗?这可能值得回答:-) -
@Kevin 它真的不起作用。正如 wowserx 解释的那样,它只适用于具有单个元素的数组(因为它们可以转换为
float)。用更大的数组试试,你会得到TypeError: only size-1 arrays can be converted to Python scalars
标签: python magic-methods