Python中__init__外声明的类变量为何累加表现不同?如何实现netPosition正确累加
问题根本原因
- 该差异本质是Python中可变对象和不可变对象的操作逻辑不同,加上类变量、实例变量的查找规则共同导致的:
allTrades是列表(可变对象):执行self.allTrades.append()时,不会改变变量的内存指向,直接修改类层面共享的同一个列表对象,所以所有实例的修改都会生效,能正常累加。netPosition是整数(不可变对象):执行self.netPosition += 数量时,Python会为当前实例创建一个同名的实例属性,后续操作的都是实例自己的属性,不会修改类层面的netPosition,所以每个实例的这个值都是独立的,无法全局累加。
另外你贴的代码存在参数不匹配问题:Trade类的__init__只定义了qty一个参数,但是实例化时传入了3个参数,运行会直接报错,需要先修正参数定义。
修正方案
如果要让netPosition作为全局累加的类变量,操作时直接用类名Trade访问类变量,不要用self访问,避免被实例属性覆盖。
完整修改后代码
class Trade: allTrades = [] netPosition = 0 # 修正__init__参数,匹配实例化时传入的交易方向、数量、价格三个参数 def __init__(self, trade_type, qty, price): self.quantity = qty self.trade_type = trade_type self.price = price # 直接操作类变量 Trade.allTrades.append(self.quantity) Trade.netPosition += self.quantity # 实例化对象 deal1=Trade('long', 50, 31) deal2=Trade('long', 16, 39) print(deal2.allTrades) # 输出 [50, 16] print(Trade.netPosition) # 输出 66 # 用实例访问也会拿到类变量的值,因为没有创建同名实例属性覆盖 print(deal2.netPosition) # 输出 66
内容的提问来源于stack exchange,提问作者KiNest
相关产品推荐
相关产品推荐

