Python同一类内跨方法调用实例变量报AttributeError问题咨询
报错原因
- 核心问题是
balance属性的初始化时机不对:你只有调用account_balance方法的时候才会给实例创建balance属性,如果你在调用account_deposite方法之前没有先调用account_balance,实例就不存在balance属性,累加操作自然会触发属性不存在的报错。 - 额外规范问题:你没有在
__init__初始化方法中提前定义balance属性,不符合Python类属性定义的常规逻辑,很容易出现这类调用顺序导致的bug。
修复方案
推荐优先选择在初始化方法中统一初始化属性的方案,彻底规避调用顺序问题,修改后的代码如下:
class Account_Balance(Account_General): def __init__(self, first_name, middle_name, last_name, PIN, DoB, city, address, phone_number, email): super().__init__(first_name, middle_name, last_name, PIN, DoB, city, address, phone_number, email) # 初始化阶段就定义balance属性,初始值设置为10.0 self.balance = 10.0 # 原account_balance方法可以保留作为余额查询方法,语义更清晰 def get_balance(self): return self.balance def account_deposit(self, amount): # 无需将入参amount赋值为实例属性,直接累加即可 self.balance += amount
如果你需要保留原逻辑,必须严格遵循调用顺序:先调用account_balance()初始化属性,再调用存款方法,示例如下:
# 实例化账户对象 acc = Account_Balance("张", "三", "", "1234", "2000-01-01", "北京", "XX路XX号", "13XXXXXXXXX", "xxx@xx.com") # 先调用方法初始化balance属性 acc.account_balance() # 再执行存款操作就不会报错 acc.account_deposite(200)
优化建议
- 类的业务属性尽量统一在
__init__方法中定义,不要分散到普通实例方法中初始化,避免出现调用顺序问题导致的偶发bug。 - 方法命名尽量符合语义,比如存款方法的拼写可修正为
account_deposit(原拼写deposite为常见拼写错误),方便后续代码维护。
内容的提问来源于stack exchange,提问作者lyubol
相关产品推荐
相关产品推荐

