如何在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
相关产品推荐
相关产品推荐

