Python3.6中继承int类创建Dimension自定义类遇继承失效问题
嘿,这个需求我之前也碰到过!要做一个既能当整数用,又能存元数据和单位的类,核心问题在于处理不可变类型(int)的继承——因为int的构造函数不接受额外参数,直接继承容易踩坑。我来给你一步步解决:
完整实现方案
直接继承int,但重写__new__方法规避参数问题,再在__init__里添加自定义属性:
import numpy as np class Dimension(int): def __new__(cls, value, unit=None): # 只把数值参数传给int的构造函数,创建基础实例 instance = super().__new__(cls, value) return instance def __init__(self, value, unit=None): # 初始化自定义属性:单位和空的元数据字典 self.unit = unit self.metadata = {} # 测试你的需求场景 if __name__ == "__main__": m = Dimension(4, "iris_feature") print(m + 1) # 输出 5,完全符合你要的整数结果 # 验证numpy兼容性 arr = np.random.normal(size=(150, m)) print(f"生成的数组形状: {arr.shape}") # 输出 (150, 4) # 添加元数据 m.metadata["notes"] = "Darth Plagueis still lives" print(f"元数据内容: {m.metadata}") # 输出 {'notes': 'Darth Plagueis still lives'} print(f"维度单位/名称: {m.unit}") # 输出 iris_feature
为什么这样能解决问题?
- 重写
__new__是关键:int是不可变类型,实例由__new__创建。我们只传递数值参数给父类的__new__,避免了额外参数导致的继承报错——这应该就是你之前碰到的问题! - 不破坏整数行为:因为
Dimension是int的子类,所有接受int的场景(算术运算、numpy的维度参数)都能直接用,不需要额外适配。 - 自定义属性独立:
unit和metadata是附加在实例上的属性,完全不影响整数的核心功能。
可选扩展:运算后保留元数据
如果你希望和数值运算后仍然返回Dimension实例(比如m + 1返回Dimension(5, "iris_feature")而不是纯整数),可以重载算术方法:
class Dimension(int): # 保留上面的__new__和__init__ def __add__(self, other): result_val = super().__add__(other) return Dimension(result_val, self.unit) def __radd__(self, other): # 处理类似 1 + m 的反向运算 return self.__add__(other) # 按需扩展__mul__、__sub__、__div__等方法
这样扩展后,运算结果会保留原实例的unit,元数据则会初始化为空(你也可以修改逻辑让元数据继承过去,比如return Dimension(result_val, self.unit, self.metadata.copy()),记得要同步修改__init__来接收metadata参数)。
内容的提问来源于stack exchange,提问作者O.rka
相关产品推荐
相关产品推荐

