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

如何在Python类中用__new__创建字典并为键添加单位属性

解决方法:让自定义类继承dict并添加方法

你当前的写法有个核心问题:当__new__返回一个普通字典时,这个对象的类型是dict,而不是MyClass——这意味着你定义的unit方法根本不会被绑定到这个字典实例上,调用时会直接抛出AttributeError。

要实现“给字典任意键设置单位”的需求,最直接的方式是让MyClass继承自dict,这样你的类既拥有字典的所有原生功能,又能轻松添加自定义方法。下面是具体实现:

class MyClass(dict):
    def __init__(self):
        # 初始化默认的键值对
        super().__init__({
            'key1': None,
            'key2': None
        })
    
    def set_unit(self, key, unit):
        """给指定字典键设置单位"""
        # 处理值为None的情况:创建一个带unit属性的对象来包装值
        if self[key] is None:
            # 用动态类快速创建一个支持value和unit属性的对象
            self[key] = type('ValueWithUnit', (), {'value': None, 'unit': unit})()
        else:
            # 如果值已存在,直接设置unit属性
            self[key].unit = unit

使用示例:

obj = MyClass()
obj.set_unit('key1', 'kg')
obj.set_unit('key2', 'm/s')

print(obj['key1'].unit)  # 输出: kg
print(obj['key2'].unit)  # 输出: m/s

# 后续还可以给值赋值
obj['key1'].value = 5.6
print(obj['key1'].value)  # 输出: 5.6

为什么这样可行?

  1. 继承dict后,MyClass的实例本质就是一个字典,你可以像操作普通字典一样使用它(比如obj['key1'] = ...)。
  2. set_unit方法作为类的成员,可以直接通过实例调用,并且方法里的self就是当前字典实例,能直接操作键值对。
  3. 针对None值的处理:因为原生类型(比如int、str)不能直接添加属性,所以我们用一个动态创建的类来包装值,这样就能给它绑定unit属性了。

如果你坚持想用__new__的方式实现,其实也可以,但需要返回一个自定义字典类的实例(而不是普通dict),不过这种写法不如直接继承简洁,这里就不展开了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:21:09