如何让drain函数返回值同步更新Tank类的cap属性?
解决Tank类属性无法被drain函数修改的问题
问题根源
原代码中,drain函数接收的是uppertank.cap和lowertank.cap的数值(int是不可变类型),传递的是值的副本。函数内修改的只是局部变量a和b,和原Tank对象的cap属性没有关联,所以外部的属性值不会变化。另外,原代码把实例创建、执行逻辑直接写在类内部,不符合Python代码结构规范,会导致类定义阶段就执行这些代码。
解决方案1:传递Tank对象而非数值
把drain函数改为接收Tank实例对象,直接修改对象的cap属性:
class Tank: def __init__(self, cap): self.cap = cap # 类外创建实例,避免类定义时自动执行逻辑 uppertank = Tank(70) lowertank = Tank(10) print("uppertank", uppertank.cap) print("lowertank", lowertank.cap) def drain(from_tank, to_tank): # 直接操作对象的cap属性 to_tank.cap += from_tank.cap from_tank.cap = 0 print("drain后 来源罐容量", from_tank.cap) print("drain后 目标罐容量", to_tank.cap) # 传入实例对象,而非属性值 drain(uppertank, lowertank) print("uppertank", uppertank.cap) print("lowertank", lowertank.cap)
解决方案2:使用面向对象的实例方法
把drain定义为Tank类的实例方法,更符合面向对象设计:
class Tank: def __init__(self, cap): self.cap = cap # 实例方法:将当前罐的容量转移到目标罐 def drain_to(self, target_tank): target_tank.cap += self.cap self.cap = 0 print("drain后 来源罐容量", self.cap) print("drain后 目标罐容量", target_tank.cap) uppertank = Tank(70) lowertank = Tank(10) print("uppertank", uppertank.cap) print("lowertank", lowertank.cap) # 调用实例方法完成转移 uppertank.drain_to(lowertank) print("uppertank", uppertank.cap) print("lowertank", lowertank.cap)
核心逻辑说明
Python中,不可变类型(如int、str)传递的是值的副本,修改局部变量不会影响原变量;可变类型(如自定义类实例)传递的是对象引用,修改对象的属性会直接作用于原对象。原代码错误地传递了不可变的数值,而非对象本身,导致无法修改原属性。
内容的提问来源于stack exchange,提问作者Firefly
相关产品推荐
相关产品推荐

