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

如何在Python类中重写点语法,实现自定义字典的属性式赋值?

实现点语法操作类中自定义字典的方案

要实现用点语法(如bar.baz = 'hello')操作类内的自定义字典__values__,需要重写Python的两个魔法方法:__setattr__(处理属性赋值逻辑)和__getattr__(处理属性获取逻辑)。

完整实现代码

class Foo:
    def __init__(self):
        # 用父类的__setattr__初始化__values__,避免触发自定义逻辑导致递归
        super().__setattr__('__values__', {})

    def __setattr__(self, name, value):
        # 把点语法赋值的属性存入自定义字典
        self.__values__[name] = value

    def __getattr__(self, name):
        # 从自定义字典中读取属性值
        return self.__values__[name]

bar = Foo()
bar.baz = 'hello'

print(bar.baz)  # 输出: hello
print(bar.__values__)  # 输出: {'baz': 'hello'}

关键逻辑说明

  • __setattr__:当通过点语法给实例赋值时,Python会自动调用该方法。这里我们直接将属性名和对应值存入__values__字典,替代默认的实例属性存储逻辑。
  • __getattr__:当访问的属性不在实例的常规属性集合中时,Python会调用该方法。我们在这里从__values__字典中返回对应的值,实现点语法读取字典内容。
  • 初始化__values__的特殊处理:如果直接在__init__中写self.__values__ = {},会触发自定义的__setattr__,导致把__values__作为键存入自身,引发递归错误。使用super().__setattr__可以绕过自定义逻辑,直接设置实例属性。

可选优化:属性不存在的异常处理

如果需要和Python原生属性报错逻辑一致,可以在__getattr__中添加异常捕获:

def __getattr__(self, name):
    try:
        return self.__values__[name]
    except KeyError:
        raise AttributeError(f"'Foo' object has no attribute '{name}'")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:50:33