为何无法通过另一对象的实例方法修改对象实例变量?求其他实现方案
问题分析:为何无法通过实例方法直接修改另一对象的实例变量?
嘿,我来帮你拆解这个问题!首先咱们得先搞清楚你代码里的问题出在哪,再聊聊其他可行的实现方式。
问题根源
你现在遇到的问题主要有两个:
- 参数传递的误区:在调用
hello.deposit(dep, bye.balance)时,你传递的是bye.balance的数值副本,而不是bye这个Account对象本身。Python里的整数是不可变类型,当你把它作为参数传入方法时,方法里操作的只是这个副本,根本不会影响原对象bye的balance属性。 - 硬编码全局对象的不良实践:你在
deposit方法里直接写bye.balance += dep_amount,这里的bye是你全局定义的那个对象——虽然现在代码能跑,但如果以后创建多个Account实例,这段代码会彻底失效,完全不具备复用性。
修正后的标准实现
最规范的做法是传递Account对象本身,并且让Account类自己负责修改自身的balance属性(遵循封装原则)。这里给你调整后的代码:
class People(object): def __init__(self, name , cash, count): self.cash = cash self.name = name self.count = count def __str__(self): return f"{self.count}\t{self.name}" def deposit(self, dep_amount, account): # 先校验现金是否充足,避免负数情况 if self.cash >= dep_amount: self.cash -= dep_amount account.add(dep_amount) # 调用Account的实例方法修改余额 else: print("现金不足,无法完成存款操作") class Account(object): def __init__(self, name, count, balance=0): self.name = name self.count = count self.balance = balance def __str__(self): return f"{self.count}\taccount by {self.name}" def add(self, dep): self.balance += dep # 把修改余额的逻辑封装在Account自己的方法里 # 实例化与调用 hello = People('cz', 1000, 0) bye = Account('cz', 0) dep = int(input('dep amount enter pls')) hello.deposit(dep, bye) # 这里传递的是Account对象,而不是balance属性 print(hello.cash, bye.balance) hello.cash = 12345 print(hello.cash)
其他可行的实现方式
除了上面的标准写法,还有几种可选方案:
- 直接操作对象属性(不推荐,但可行):如果不想给Account加
add方法,也可以直接在deposit里修改Account对象的balance属性,但这样会破坏封装性,后续扩展(比如加余额修改日志、校验)会很麻烦:def deposit(self, dep_amount, account): if self.cash >= dep_amount: self.cash -= dep_amount account.balance += dep_amount - 绑定关联账户:在People初始化时就绑定对应的Account对象,这样每次存款时不用再传参数,代码更简洁:
class People(object): def __init__(self, name , cash, count, account): self.cash = cash self.name = name self.count = count self.account = account # 初始化时绑定关联账户 def deposit(self, dep_amount): if self.cash >= dep_amount: self.cash -= dep_amount self.account.add(dep_amount) # 使用示例 bye = Account('cz', 0) hello = People('cz', 1000, 0, bye) hello.deposit(dep)
总结
核心问题就是你传递了不可变类型的属性值而非对象本身,导致无法修改原对象的属性。同时要尽量避免硬编码全局对象,遵循面向对象的封装原则,让每个类负责管理自己的属性和行为,这样代码会更健壮、更容易维护。
内容的提问来源于stack exchange,提问作者lee chuan zhe
相关产品推荐
相关产品推荐

