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

为何在该示例中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:55:00