You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

继承Python内置float类型触发TypeError的原因及非自定义基类的解决方案咨询

问题解答

1. 为何无法成功继承内置float类?

Python的内置数值类型(如float、int、str)属于不可变(immutable)类型,它们的实例创建与初始化逻辑和普通自定义类有本质区别:

  • 普通自定义类的流程是:先调用__new__创建空实例,再调用__init__对实例进行初始化赋值。
  • 但对于内置不可变类型,实例的核心数值是在__new__方法中就确定的,它们的__init__方法通常仅接收self一个参数,不处理额外的初始化参数(甚至很多内置不可变类型的__init__是空实现)。

你在代码中尝试在__init__里调用super().__init__(x / 100),但float的__init__根本不接受这个额外参数,因此触发了TypeError——本质是你误用了__init__来处理内置不可变类型的初始化逻辑,而这类逻辑本该由__new__负责。

而你自定义的MyFloat是普通可变类,__init__是正常接收并处理参数的,所以继承它时不会有问题。

2. 除自行定义MyFloat类外,是否有其他可行的解决办法?

当然有,最标准的做法是重写__new__方法,因为这才是内置不可变类型创建实例的入口:

class Percent(float):
    def __new__(cls, x):
        # 调用父类的__new__创建实例,并传入处理后的百分比数值
        return super().__new__(cls, x / 100)

print(float(Percent(12)))  # 输出0.12,符合预期

这样实现后,Percent(12)会直接创建一个值为0.12的float子类实例,转换为float时自然得到正确结果。

另外,如果你不需要严格继承float,只是希望类实例能被转换为float,也可以不继承,仅实现__float__方法(类似你自定义MyFloat的思路),但如果必须要继承float的特性,重写__new__是最优解。


内容的提问来源于stack exchange,提问作者Eric Stdlib

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 09:08:15