如何以Pythonic方式在循环中批量创建类实例的numpy数组属性?
问题原因说明
你之前的循环方案无效,是因为循环里的variables只是临时局部变量——列表里存的是原属性的引用,但重新赋值variables只是让它指向新的数组对象,并不会修改self.variable1这类实例属性本身。
几种Pythonic的解决办法
方案1:用setattr批量设置实例属性
如果想保留self.variable1这种直接访问的方式,把变量名存成字符串列表,循环用setattr给实例赋值:
def computa(self): var_names = ['variable1', 'variable2', 'variable3'] shape = (self.nx, self.ny, self.nz) for name in var_names: setattr(self, name, ma.zeros(shape, dtype=float))
后续新增变量只需要在var_names里加字符串即可,既简洁又和原代码的访问方式一致。
方案2:用字典统一管理数组
如果变量数量极多,用字典存储更便于批量操作(比如后续遍历、统一修改):
def computa(self): var_names = ['variable1', 'variable2', 'variable3'] shape = (self.nx, self.ny, self.nz) self.variables = {name: ma.zeros(shape, dtype=float) for name in var_names}
之后访问数组用self.variables['variable1'],批量处理时直接遍历self.variables.values()即可,灵活性更高。
方案3:用数据类管理结构化变量(Python3.7+)
如果这些变量是一组结构化的相关数据,用dataclasses定义后批量初始化:
from dataclasses import dataclass import numpy.ma as ma @dataclass class Variables: variable1: ma.MaskedArray variable2: ma.MaskedArray variable3: ma.MaskedArray def computa(self): shape = (self.nx, self.ny, self.nz) # 自动遍历数据类的字段生成数组 self.vars = Variables( **{name: ma.zeros(shape, dtype=float) for name in Variables.__annotations__} )
后续访问用self.vars.variable1,这种方式能明确变量类型,适合需要类型提示的场景。
内容的提问来源于stack exchange,提问作者Fdez
相关产品推荐
相关产品推荐

