我创建了一个Python类,它的核心有一个重要的浮点值,它的所有方法都适用于此。使用算术运算符使其行为顺利是非常方便的,例如:
i = MyClass(2.42342)
j = i + 5.2329
如果我为类创建__add__(self, other)
方法,我会实现这一点,如下所示:
def __add__(self, other):
return float(other) + self.number
def __float__(self):
return float(self.number)
这样我可以添加我的类的2个实例,返回一个浮点数,然后我可以向一个实例添加一个浮点数。但是如果浮点数位于左侧,则会出现错误,使得加法不可交换:
i = MyClass(3.2127)
i + 1.6743
# returns 4.887
1.6743 + i
# TypeError: unsupported operand type(s) for +: 'float' and 'instance'
我的问题是,如何让Python意识到我的类是一个适合表现为float的类型?在许多模块中,我们可以看到不是float类型的对象,但行为类似于float。例如,numpy有自己的类型,如numpy.float64
,它不是Python <type 'float'>
,但Python知道该对象支持操作数+
和其他类型:
import numpy
i = numpy.float64(12.745)
type(i)
# <type 'numpy.float64'>
j = 4.232
type(j)
# <type 'float'>
j + i
# 16.977
如果你想尝试,这里是清理过的课程:
class MyClass(object):
def __init__(self, number):
self.number = number
def __neg__(self):
return -1 * self.number
def __add__(self, other):
return float(other) + self.number
def __sub__(self, other):
return self.number - float(other)
def __mul__(self, other):
return self.number * float(other)
def __float__(self):
return self.number