如何为自定义类重载`float()`方法?

16

如何实现重载float()方法,即当我编写的类的实例被传递给float()时调用它?

我正在编写自己的Fraction类:

class Fraction:
    def __init__(self, num = 0, denom = 1):
        self.num = float(num)
        self.denom = float(denom)

现在我想要能够做到这一点:

float(Fraction())

我尝试使用下面的方法,但没有起作用。

def float(self):
    return self.num / self.denom

@DavidHeffernan,你能帮我一个忙吗?我的问题在这里:http://stackoverflow.com/questions/9938329/why-use-a-flat-list-in-heapsort 因为太模糊而被关闭。我已经编辑过了,现在看起来像是一个完全合法的SO问题。 - Yatharth Agarwal
事实是,我的账户因此被自动禁止了,我不能再提问了,所以如果您认为我的问题足够好,请给它点赞,谢谢。 - Yatharth Agarwal
是的,+1,对我来说看起来是一个公平的问题。 - David Heffernan
@DavidHeffernan 非常感谢。如果可以的话,您能否将该问题标记为管理员关注,以便重新打开?(显然,这个权限也被剥夺了 :<) - Yatharth Agarwal
@DavidHeffernan 您的意思是您有足够的声望来投票重新开放吗? - Yatharth Agarwal
显示剩余4条评论
1个回答

28

在你的类上定义 __float__() 特殊方法。

class MyClass(object):
    def __float__(self):
         return 0.0

float(MyClass())   # 0.0

注意,此方法必须返回一个float类型!在Python3.0之前的版本中,默认情况下假设两个操作数都是整数,则计算self.num / self.denom将返回一个int类型。在这种情况下,你只需确保其中一个操作数是浮点数:float(self.num) / self.denom


我在我的代码中使用整数来表示self.numself.denom。感谢您的回答。 - Yatharth Agarwal
如果你没有返回一个浮点数会发生什么? - Yatharth Agarwal
1
您会收到一个 TypeError 异常。 - kindall
1
@YatharthROCK: 基本上,你将会在你的 Python 解释器中创建一个不稳定的黑洞,宇宙将被摧毁。我认为 kindall 只是指出了这个事实,即在 <= Python 2.x 中,“/”默认表示整数除法,在 Python 3.x 中则表示浮点数除法。你应该注意这一点。 - Joel Cornett
1
@kindall:所以当您调用其中一个特殊方法时,它不仅执行重载的方法,而且仍然通过特殊方法传递? - Joel Cornett
如果您使用的是Python <3.0版本,您可以始终使用future import来获取返回浮点数的除法,即:from __future__ import division。然后self.num / self.denom将正常工作。 - CrepeGoat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接