如何使用类方法更新可变类属性?Python类属性传递问题
如何使用类方法更新可变类属性?
你的代码问题出在:Python中字符串是不可变类型,传递给add_val的attrib只是原属性值的副本,修改这个局部变量不会影响实例的self.a或self.b。下面提供几种实用的解决方法:
方法1:通过属性名字符串直接操作实例属性
传递属性的名称(字符串形式),用getattr获取当前值,setattr直接修改实例属性:
class Test(): def __init__(self, a=None, b=None): self.a = a or "" self.b = b or "" def add_val(self, attrib_name, val, sep=";"): current_val = getattr(self, attrib_name) new_val = f'{current_val}{sep}{val}' if current_val else val setattr(self, attrib_name, new_val) def add_val_to_a(self, val, sep=";"): self.add_val("a", val, sep) def add_val_to_b(self, val, sep=";"): self.add_val("b", val, sep) t = Test() t.add_val_to_a("new_val") print(t.a) # 输出: new_val
方法2:让工具方法返回新值,调用方赋值
利用不可变类型的特性,让add_val生成并返回修改后的字符串,再由调用方法赋值给对应属性:
class Test(): def __init__(self, a=None, b=None): self.a = a or "" self.b = b or "" def add_val(self, attrib, val, sep=";"): return f'{attrib}{sep}{val}' if attrib else val def add_val_to_a(self, val, sep=";"): self.a = self.add_val(self.a, val, sep) def add_val_to_b(self, val, sep=";"): self.b = self.add_val(self.b, val, sep) t = Test() t.add_val_to_a("new_val") print(t.a) # 输出: new_val
方法3:用可变类型存储属性(适合特殊场景)
如果不想每次手动赋值,可以用列表这类可变类型存储属性值,传递引用后直接修改内部元素:
class Test(): def __init__(self, a=None, b=None): self.a = [a] if a is not None else [] self.b = [b] if b is not None else [] def add_val(self, attrib, val, sep=";"): if attrib: attrib[0] = f'{attrib[0]}{sep}{val}' else: attrib.append(val) def add_val_to_a(self, val, sep=";"): self.add_val(self.a, val, sep) def add_val_to_b(self, val, sep=";"): self.add_val(self.b, val, sep) t = Test() t.add_val_to_a("new_val") print(t.a[0]) # 输出: new_val
日常开发中前两种方法最常用:方法1适合需要批量操作多个属性的场景,方法2逻辑更直观易懂,可根据你的实际需求选择。
内容的提问来源于stack exchange,提问作者dewser_the_board
相关产品推荐
相关产品推荐

