Python类初始化器中接收多返回值给实例变量赋值有没有更简洁规范的写法?
方案1:保留字段单独赋值,兼容后续新增字段
你当前的写法在返回值固定的场景下是完全可用的,问题只在于后续load()新增返回值时需要手动修改__init__里的解包代码,维护成本高。可以通过预定义字段列表的方式优化,后续加字段只需要更新字段列表即可:
class Runner(object): # 按load返回顺序定义字段,后续新增字段直接加在这里即可 _load_fields = ["first", "second", "third", "mapping"] def __init__(self): load_res = self.load() for idx, field_name in enumerate(self._load_fields): setattr(self, field_name, load_res[idx]) # 注意原写法的load没有self参数,作为实例方法必须加self,或者声明为@staticmethod def load(self): ... return (first, second, third, mapping)
优势:原有调用逻辑完全不用改,还是可以直接用self.first这种方式取属性,适配成本低。
方案2:直接存整个返回结果,扩展性最强
如果不需要单独把每个值都拆成实例属性,直接把返回结果统一存在一个属性里是最省事的,后续load()不管加多少返回值都不用改初始化逻辑:
class Runner(object): def __init__(self): # 可以直接存元组,也可以转成字典方便按名取值 self.load_result = self.load() # 如果想要按键取值可以改成: # self.load_map = dict(zip(["first", "second", "third", "mapping"], self.load())) def load(self): ... return (first, second, third, mapping)
优势:完全不用关心load()的返回值变化,维护成本最低,适合返回值数量变化频繁的场景。
方案3:优化load返回结构,直接返回字典
如果可以修改load()的实现,最合理的方式是让它直接返回字典而不是元组,彻底避免顺序变动导致的解包错误,后续新增字段也完全不影响老逻辑:
class Runner(object): def __init__(self): self.config = self.load() # 常用的字段也可以单独拎出来赋值,兼顾易用性和扩展性 self.first = self.config["first"] def load(self): ... return { "first": first, "second": second, "third": third, "mapping": mapping }
优势:不存在元组解包的顺序依赖问题,就算后续调整返回顺序、新增返回字段,老代码都不会出错,是工程上最推荐的实现方式。
内容的提问来源于stack exchange,提问作者marlon
相关产品推荐
相关产品推荐

