继承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
相关产品推荐
相关产品推荐

