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

Python类实例属性能否在__init__方法外创建?相关疑问解析

Python实例属性动态创建的疑问与解答

我能找到的所有Python 3.x文档似乎都暗示实例属性只能在类的__init__方法中创建,未发现文档或示例表明可在其他实例方法中创建。但以下代码却能正常运行,我本以为会抛出AttributeError:

class Something:
    def __init__(self):
        self.some_value = 1

    def store_values(self, new_value):
        self.some_value = new_value
        self.other_value = new_value + 2  # Shouldn't this be an `AttributeError` because there is no such attribute on `self`?

something = Something()
something.store_values(8)
print(something.some_value, something.other_value) # prints 8 10

我的疑问

  • 为什么这段代码能正常运行?
  • 相关内容是否有官方文档说明?
  • 我认为这是个不良特性,若在实例方法中误写__init__中声明的属性名,会意外创建新实例属性,而非抛出错误提示。

接受解答后补充

  • @Carcigenicate 指出__slots__可限制这种动态创建实例属性的灵活性;@jonrsharpe 给出一篇关于Python代码风格的优质博客;@user2357112 指向Python教程9.3.3节,其中示例展示了可随意添加和删除实例属性,暗示实例的属性字典可作为临时状态存储区。
  • 但我仍未找到在__init__外创建实例属性的必要场景,希望有人能提供合适的用例。
  • Python Wiki的UsingSlots条目提到__dict__的底层工作机制:__dict__是存储变量名和值的字典,支持动态创建变量但易引发未捕获错误,比如拼写错误会创建新变量,而使用__slots__会抛出AttributeError。
  • 需注意上述代码仅在调用store_values方法后访问other_value属性才有效,若移除倒数第二行,最后一行会抛出AttributeError,这对新手调试造成困扰。
  • 最佳实践:将实例属性声明限制在__init__方法中。

内容的提问来源于stack exchange,提问作者Matthew Rips

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 22:04:53