【问题标题】:Why are instances of the `object` class immutable in Python?为什么“object”类的实例在 Python 中是不可变的?
【发布时间】:2016-11-28 21:06:25
【问题描述】:
>>> a = object()
>>> a.x = 5
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'x'
>>> b = lambda:0
>>> b.x = 5
>>> b.x
5

为什么object 类的实例没有__dict__,导致它表现为语义不可变?选择这种设计的原因是什么?

具体来说,为什么:

在 C 中定义的类型的实例没有 __dict__ 属性 默认。

this question.中所述

【问题讨论】:

标签: python attributes immutability


【解决方案1】:

Python 2 is not very helpful 的文档解释了为什么不能将属性分配给object(),但Python 3 provides a bit more information 的文档:

返回一个新的无特征对象。 object 是所有类的基础。它具有所有 Python 类实例通用的方法。此函数不接受任何参数。

注意:对象没有__dict__因此您不能将任意属性分配给对象类的实例

因此,您不能向object() 添加任意属性的原因似乎是因为object() 实例没有__dict__ 属性的实现,而不是因为object() 实例是不可变的:

>>> hasattr(object(), '__dict__')
False
>>>

另一件有趣的事,但可能与手头的讨论无关,是虽然对象的实例可能没有__dict__ 实现,但object 类本身有:

>>> hasattr(object, '__dict__')
True

至于问题的 why 部分,我找不到任何确切原因说明为什么 object() 没有 __dict__。这可能是因为 - 正如@tdelany 在 cmets 中已经提到的 - 一个实现细节。如果你真的想要一个明确的答案,你应该ask Guido himself

【讨论】:

  • @SeanPianka 没有。但我还在寻找。我认为展示为什么不能向object() 添加属性会很有用。
  • 因为它是一个内置类。
  • object 是用 C 实现的,扩展对象不带额外属性的共同点。考虑到常规类实例 __dict__ 是一个对象,object 没有对象也就不足为奇了!
  • @SeanPianka 就像我说的,我还在努力。给我一些时间:)
  • @leaf - 这里是个好地方:hg.python.org/cpython/file/tip/Include/object.h。它将向您展示实现的详细信息。
猜你喜欢
  • 2021-04-15
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
  • 2020-09-29
  • 2012-04-20
相关资源
最近更新 更多