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
相关产品推荐
相关产品推荐

