__Python中对象的最终基类的dict__u属性

__Python中对象的最终基类的dict__u属性,python,dictionary,magic-methods,Python,Dictionary,Magic Methods,下面的代码按排序顺序列出了名为“a”的类的属性:- >A类() 定义初始化(self,i): self.at=i >>>分类(vars(A)) [“dict”、“doc”、“init”、“module”、“weakref”] 现在,打印key的值,“dict”会产生以下结果:- >>变量(A)[“dict”的值 (也由@eliotness提及)但这是第二部分(如下所述),我找不到任何答案或相关问题,因此,更改了问题的标题 让我们考虑另一个生成Python中的基类属性列表的代码,对象< /代码

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

>A类()
定义初始化(self,i):
self.at=i
>>>分类(vars(A))
[“dict”、“doc”、“init”、“module”、“weakref”]
现在,打印key的值,
“dict”
会产生以下结果:-

>>变量(A)[“dict”的值
(也由@eliotness提及)但这是第二部分(如下所述),我找不到任何答案或相关问题,因此,更改了问题的标题


让我们考虑另一个生成Python中的基类属性列表的代码,<代码>对象< /代码>:-< /P> 排序(变量(对象)) [uuuu类uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu >>>hasattr(对象,'.'命令'.) 真的 >>>已排序(getattr(object,'.\u dict')==已排序(vars(object)) 真的

另一个引用自文档中关于
对象的内容。\uu dict\uuu

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


这次,
“dict”
不会显示在
对象的列表中。那么,在
对象
或任何其他原因的情况下,
\uu dict\uu
属性是只读属性吗

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



首先,我想说我只知道你问题的部分答案。关于python的行为,第二部分可能并不完全正确。但首先,我想澄清一些事情:您引用的文档涉及普通对象,可能不适用于元类,因为它们的内部行为完全是用C编写的

vars(A)['dict'] 我理解python是如何工作的,我怀疑您在这里看到的
\uuu dict\uuu

>>> vars(A)['__dict__']                 #Value of '__dict__'
<attribute '__dict__' of 'A' objects>
>>变量(A)[“dict”的值
:

模块和实例等对象具有可更新的
\uu dict\uu
属性;但是,其他对象可能对其
\uuu dict\uuu
属性有写限制(例如,类使用types.MappingProxyType来防止直接更新字典)

但这一行为在《宪法》中也有明确规定


编辑:我开始找到关于wierd
vars(A)[“dict”]
的好信息。看一看

您问题的第一部分已经由回答:实例的
\uu dict\uuu
存储为类上的。这是
A.\uuuuu dict\uuuuu['\uuuu dict\uuuuu']
A.uu dict\uuu
另一方面存储
A
类的所有属性,该类本身是
类型的一个实例。所以实际上是
type.\uuuu dict\uuuu[''.\uu dict\uuuu']
提供了以下变量:

>>>类型.uuuu dict_uuu[''uuuu dict_uuu']
:

>>B类:
...     __插槽\uuux=()
... 
>>>vars(B)
映射代理({“uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
>>> 
>>>b=b()
>>>b.x=1
AttributeError:“B”对象没有属性“x”

@eliotness,在查看了您在最后给出的链接之后,似乎
''dict'
是一个不同的属性,将用于类的实例。但是在阅读文档中关于
对象
基类的内容时,最后给出的注释让我有点困惑注意:对象没有
\uuuu dict\uuuu
,因此不能将任意属性分配给对象类的实例。继续…我的意思是代码
hasattr(对象,'.\uu dict\uuu')
返回
True
(我在问题中也写了它)。另外,
vars(object)
也可以正常工作。那么这个语句“
object
没有一个
\uu dict\uu
属性”准确的程度是多少呢?@敏锐的是,我们可以肯定的一点是
object
类的doc是不明确的,因此我们不知道他们是谈论
object
的实例还是类本身。关于类
对象
\uuuu dict\uuuu
属性,它可能与类的描述符有关。我正在检查是否在我的书中找到了一些东西,但我担心我们将不得不在CPython中寻找类
对象
对象的
\uu调用
\uu新建的基本实现。@eliotness,我认为关于
对象
的文档是关于类
对象
本身的,而不是关于它的实例,但即使它是关于
对象
本身的实例(Python中的每个对象都是),它对我来说似乎并不准确,我认为,人们可以使用每一种标准方式查看
对象的
\uuu dict\uuu
属性,否则,可以使用这些标准方式访问任何其他正常对象的
\uu dict\uu
。只是它是一个只读属性(我的意思是像类对象一样,打印它的
\uu dict\uuu
也会产生一个
mappingproxy
对象),直到现在,我还找不到一种方法来获得一个对象的只读属性列表。我认为我不能同意这一点“在对象上看不到
\uuu dict\uuuu
属性的原因是因为它没有属性”,因为在这种情况下,
hasattr(object,“\uu dict””
将返回
False
,但它返回
True
,因此,
vars(object)
返回
映射代理
类型字典”这阻止了直接的字典更新”(如文档中所述)。我强烈感觉
object
\u dict\u
是一个只读属性,因此,没有实例变量可以设置为
object
实例,并且不会出现在
vars(object)中
。@我的意思是,
对象
没有一个
\uuuuu dict\uuuu
描述符(类似于
a.\uu dict\uuuu[']