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

Posted

技术标签:

【中文标题】如何为自定义类重载`float()`?【英文标题】:How do I overload `float()` for a custom class? 【发布时间】:2012-04-19 12:25:03 【问题描述】:

如何实现重载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 你能帮我个忙吗?我的问题是:***.com/questions/9938329/… 因含糊不清而被关闭。我对其进行了编辑,现在对于 SO 来说,这似乎是一个完全合法的问题。 问题是,我的帐户因此被自动禁止,我不能再问任何问题了,所以如果您认为我的问题足够好,请给它投票吗? @DavidHeffernan ???至少回复说“是”或“否”? 是的,+1,在我看来是一个公平的 Q @DavidHeffernan 非常感谢。如果它不会太多,您是否也可以标记问题以引起主持人的注意,以便可以重新打开它? (显然,该特权也被剥夺了: 【参考方案1】:

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

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

float(MyClass())   # 0.0

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

【讨论】:

am在我的代码中为self.numself.denom 使用整数。 10 倍的答案。 如果不返回浮点数会发生什么 你得到一个TypeError 异常。 @YatharthROCK:基本上,您将在您的 python 解释器中创建一个不稳定的黑洞,宇宙将被摧毁。我认为kindall只是指出/ @kindall:那么当你调用其中一个特殊方法时,它不只是执行重载的方法,它仍然通过特殊方法?

以上是关于如何为自定义类重载`float()`?的主要内容,如果未能解决你的问题,请参考以下文章

android如何为自定义的类传递参数?

如何为 UIPageViewController Delegate 制作自定义类?

如何为管道中的异常值删除实现 Python 自定义类?

如何为自定义类的参数指定类型提示? [复制]

如何为 System.Serializable 类设置自定义 json 字段名称?

带 plotly 的树状图 - 如何为层次聚类设置自定义链接方法