如何在Python中实现类属性动态同步的MATLAB struct等效类?
实现类似MATLAB struct的Python类:实例新增属性时自动扩展类属性
当然可以实现这个需求!我们可以通过重写Python类的__setattr__特殊方法,拦截属性赋值的流程,从而达到**当某个实例新增属性时,自动给类本身添加该属性(默认值为空字符串)**的效果,这样其他实例就能直接访问这个属性,默认值就是空串。
完整实现代码
class color: def __setattr__(self, name, value): # 检查当前类是否已存在该属性 if not hasattr(type(self), name): # 若不存在,给类添加该属性,默认值为空字符串 setattr(type(self), name, '') # 完成当前实例的属性赋值(避免递归调用) super().__setattr__(name, value)
测试验证(完全匹配你的示例)
>>> red = color() >>> blue = color() >>> blue.temperature AttributeError: 'color' object has no attribute 'temperature' # 初始类无该属性,访问报错 >>> red.temperature = 'hot' # 给red实例赋值时,自动给color类添加temperature属性(默认'') >>> blue.temperature # 现在类有了该属性,blue读取到默认值'' '' >>> blue.temperature = 'cool' # 给blue实例赋值,覆盖类属性的默认值 >>> blue.temperature 'cool' >>> red.temperature # red仍保留自己的赋值'hot' 'hot'
原理说明
__setattr__是Python中负责处理属性赋值的内置方法,每次给实例属性赋值时都会触发它。- 我们先通过
type(self)获取实例所属的类,检查类是否已经拥有目标属性名;如果没有,就用setattr给类添加该属性并设置默认空串。 - 最后调用
super().__setattr__完成实例的属性赋值,这样可以避免直接使用self.name = value导致的__setattr__递归调用问题。
补充说明
当某个实例给属性赋值后,该实例会拥有自己的实例属性,而类本身的属性作为默认值存在;其他未赋值的实例访问该属性时,会读取类属性的默认值,这完全符合你想要的MATLAB struct类似行为。
内容的提问来源于stack exchange,提问作者Post169
相关产品推荐
相关产品推荐

