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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:29:29