如何使Python类实例假装为某种类型(例如float)?

时间:2015-10-22 10:14:27

标签: python override method-overriding instance-methods

我创建了一个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

0 个答案:

没有答案