__dict__ 终极基类的属性,Python 中的对象

Per*_*ous 5 python dictionary magic-methods

以下代码按排序顺序列出了名为“A”的类的属性:-

>>> class A():
        def __init__(self, i):
            self.at = i

>>> sorted(vars(A))
['__dict__', '__doc__', '__init__', '__module__', '__weakref__']
Run Code Online (Sandbox Code Playgroud)

现在,打印键的值,'__dict__'结果如下:-

>>> vars(A)['__dict__']                 #Value of '__dict__'
<attribute '__dict__' of 'A' objects>
Run Code Online (Sandbox Code Playgroud)

根据文档, vars([object])

返回具有__dict__属性的模块、类、实例或任何其他对象的__dict__属性。


我不明白的是,'__dict__'列表中的属性是用于vars()返回属性的相同属性A还是具有其他目标的不同属性,例如按照建议(根据我的说法)实现 A 的对象命名空间的值其中成立。'__dict__'


编辑:-

问题的第一部分与另一个问题(也由@eliotness 提到)非常相关,但这是第二部分(如下所述),我找不到任何答案或相关问题,因此,更改标题题。


让我们考虑另一个在 Python 中生成最终基类属性列表的代码object:-

>>> sorted(vars(object))
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', ...., '__str__', '__subclasshook__']
>>> hasattr(object, '__dict__')
True
>>> sorted(getattr(object, '__dict__')) == sorted(vars(object))
True
Run Code Online (Sandbox Code Playgroud)

来自文档的另一个引文关于 object.__dict__

用于存储对象(可写)属性的字典或其他映射对象。


这一次,'__dict__'没有出现在 的列表中object。那么,该__dict__属性是否为只读属性,以防万一object或任何其他原因?

另外,是否有可能以任何方式获取 Python 中的只读属性列表


a_g*_*est 3

您的问题的第一部分已经由链接的答案回答:__dict__实例的实例作为描述符存储在类上。这是A.__dict__['__dict__']. A.__dict__另一方面存储A类的所有属性 - 类本身是 的实例type。所以实际上它type.__dict__['__dict__']提供了这些变量:

>>> type.__dict__['__dict__']
<attribute '__dict__' of 'type' objects>
>>> A.__dict__ == type.__dict__['__dict__'].__get__(A)
True
Run Code Online (Sandbox Code Playgroud)

__dict__您看不到属性的原因object是因为它没有属性。这意味着您无法在object实例上设置实例变量:

>>> o = object()
>>> o.x = 1

AttributeError: 'object' object has no attribute 'x'
Run Code Online (Sandbox Code Playgroud)

通过定义自定义类可以实现类似的行为__slots__

>>> class B:
...     __slots__ = ()
... 
>>> vars(B)
mappingproxy({'__module__': '__main__', '__slots__': (), '__doc__': None})
>>> 
>>> b = B()
>>> b.x = 1

AttributeError: 'B' object has no attribute 'x'
Run Code Online (Sandbox Code Playgroud)