如何在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
为什么这样可行?
- 继承
dict后,MyClass的实例本质就是一个字典,你可以像操作普通字典一样使用它(比如obj['key1'] = ...)。 set_unit方法作为类的成员,可以直接通过实例调用,并且方法里的self就是当前字典实例,能直接操作键值对。- 针对
None值的处理:因为原生类型(比如int、str)不能直接添加属性,所以我们用一个动态创建的类来包装值,这样就能给它绑定unit属性了。
如果你坚持想用__new__的方式实现,其实也可以,但需要返回一个自定义字典类的实例(而不是普通dict),不过这种写法不如直接继承简洁,这里就不展开了。
内容的提问来源于stack exchange,提问作者linksse
相关产品推荐
相关产品推荐

