__Python中对象的最终基类的dict__u属性
下面的代码按排序顺序列出了名为“a”的类的属性:-__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类()
定义初始化(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来防止直接更新字典)
但这一行为在《宪法》中也有明确规定
编辑:我开始找到关于wierdvars(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[']
)