为何在该示例中self与类名的使用效果存在差异?
问题原因解析
你的认知确实存在偏差,类名访问类属性和self访问类属性在赋值操作时完全是两回事,以下是具体原因:
1. 类名BankAccount访问类属性的行为
initial_acount_id是定义在类中的类属性,属于BankAccount类本身,所有实例共享这个值。
当你执行BankAccount.initial_acount_id += 12时,是直接修改类属性本身的值:
- 第一次实例化
fir:类属性initial_acount_id从1000110011变为1000110011+12=100011013,然后把这个新值赋值给fir.account_id - 第二次实例化
sec:类属性再次加12,变为100011013+12=100011025,赋值给sec.account_id - 第三次实例化
thi:类属性再加12,变为100011025+12=100011037,赋值给thi.account_id
所以每个实例的account_id都是递增的不同值。
2. self访问类属性并赋值的行为
当你把代码改成self.initial_acount_id += 12时,Python的执行逻辑完全变了:
- 第一次实例化
fir:self.initial_acount_id先读取类属性的初始值1000110011,加12得到100011013,然后在fir这个实例对象中创建一个同名的实例属性initial_acount_id,把计算后的值存进去,而类本身的initial_acount_id根本没被修改。此时self.account_id等于这个实例属性的值。 - 第二次实例化
sec:self.initial_acount_id找不到实例属性(sec还没这个属性),就去读取类属性的初始值1000110011,加12得到100011013,然后在sec实例中创建自己的initial_acount_id实例属性,赋值为这个数,所以sec.account_id也是100011013。 - 第三次实例化
thi时逻辑和sec完全一样,最终三个实例的account_id全是同一个值。
总结
- 仅读取属性时,
类名.属性和self.属性效果一致(只要实例没自己的同名属性) - 执行赋值操作时:
类名.属性 = 值:修改类属性本身,所有实例共享这个变化self.属性 = 值:给当前实例添加/修改实例属性,和类属性彻底无关
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

