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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:35:33