如何实现支持链式属性赋值与访问的Python Foo类?
可以实现
先看具体的实现代码:
class Foo: def __getattr__(self, name): # 给当前实例动态添加指定名称的属性,值为Foo的新实例 setattr(self, name, Foo()) # 返回刚创建的属性值 return getattr(self, name) # 测试代码 a = Foo() a.user.details.money.pay = 130000 print(a.user.details.money.pay) # 输出 130000
实现原理说明
核心是利用Python的__getattr__特殊方法:
- 当访问对象不存在的属性时,Python会自动调用该对象的
__getattr__方法,传入要访问的属性名作为参数。 - 在
Foo类的__getattr__中,先通过setattr给当前实例动态添加与访问名同名的属性,属性值为Foo的新实例;再返回这个刚创建的实例。 - 链式访问
a.user.details.money时,每一步访问不存在的属性都会触发__getattr__,动态创建对应的子属性并返回新的Foo实例,直到最后给pay赋值——此时money已是Foo实例,直接给它添加pay属性并设置值即可。 - 最后打印时,
pay属性已存在,直接返回设置的130000。
内容的提问来源于stack exchange,提问作者Surya
相关产品推荐
相关产品推荐

