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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:58:18