Python类的uuuu dict.uuuuu dict_uuu属性是什么? >>A类(对象):通过 ... >>>格言__ >>>A__ 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 AttributeError:“dictproxy”对象没有属性“\uuu dict\uuuu” >>>A.。uuu dict.copy() {u______________________':…} >>>A.“口述” #这个物体是什么?
如果我做了Python类的uuuu dict.uuuuu dict_uuu属性是什么? >>A类(对象):通过 ... >>>格言__ >>>A__ 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 AttributeError:“dictproxy”对象没有属性“\uuu dict\uuuu” >>>A.。uuu dict.copy() {u______________________':…} >>>A.“口述” #这个物体是什么?,python,class,metaprogramming,magic-methods,Python,Class,Metaprogramming,Magic Methods,如果我做了A.something=10,这将进入A.。\uuuu dict\uuuu。什么是这个可以在A中找到。dict.\uudit.\uudit.\uudit.\uudit.\uudit.\uuu>,什么时候它包含了什么?首先A.。\uudit.\uudit.\uudit.\uuudit.\uu不同于A.。\uudit.\uudit.\uudit.\uu.\uudit.[\uudit.\uu.]。前者不存在,后者是类的实例将具有的\uuuu dict\uuuu属性。它是一个数据描述符对象,返
A.something=10
,这将进入A.。\uuuu dict\uuuu
。什么是这个
可以在A中找到。dict.\uudit.\uudit.\uudit.\uudit.\uudit.\uuu>,什么时候它包含了什么?首先A.。\uudit.\uudit.\uudit.\uuudit.\uu不同于A.。\uudit.\uudit.\uudit.\uu.\uudit.[\uudit.\uu.]。前者不存在,后者是类的实例将具有的\uuuu dict\uuuu
属性。它是一个数据描述符对象,返回特定实例的内部属性字典。简而言之,对象的\uuuuu dict\uuu
属性不能存储在对象的\uuuu dict\uuu
中,因此可以通过类中定义的描述符访问它
要理解这一点,你必须阅读
简短版本:
对于类a
的实例a
,访问a.\uuu dict\uuuu
由a.\uu dict\uuuuuu[']
提供,它与vars(a)[\uu dict\uuu']相同
对于类a
,访问a.\uu dict\uuu
由类型提供。\uu dict\uuuuu['']
(理论上)与变量(类型)[''\uu dict\u']相同。
长版本:
类和对象都通过属性操作符(通过类或元类的\uuu getattribute\uuuu
实现)和\uuuu dict\uuu
属性/协议(由vars(ob)
使用)提供对属性的访问
对于普通对象,\u dict\u
对象创建一个单独的dict
对象,该对象存储属性,\u获取属性\u
首先尝试访问它并从中获取属性(在尝试使用描述符协议在类中查找属性之前,以及在调用\uuuuu getattr\uuuuu
之前)。类上的\uuuu dict\uuuu
描述符实现对该字典的访问
- 一名名名<代码>一名名名<代码>一名名名<代码>一名名名<代码>一名名名<代码>一名名名<代码>一名名名<代码>一名名名<代码>一名名名<代码>一名名名<代码>一名名名<代码>一名名<代码>一名名<代码>一名名名名名名)是相当于尝试那些尝试的人,顺序如下:::<代码>类型(a)类型(一名名名)的。鉴于获得(一名名名名名名名名名名名名名)是相当于尝试一个尝试,顺序:::<代码>代码>类型(代码>类型(代码>类型(代码>一名名名名名名名名)是一个尝试的尝试,顺序:::<代码>类型(代码>类型(代码>类型(代码>类型)的一名)的一个尝试,一名名名:::<代码>类型(代码>类型)的一个尝试
a.uuu dict_uuu
也这么做,但由于明显的原因跳过了第二步
由于实例的\uuuu dict\uuuu
不可能存储在自身中,因此直接通过描述符协议访问,并存储在实例中的一个特殊字段中
类似的情况也适用于类,尽管它们的\uuuu dict\uuuu
是一个特殊的代理对象,假装是一个字典(但可能不是内部的),不允许您更改它或将其替换为另一个。除其他外,此代理允许您访问特定于该类且未在其某个基中定义的类的属性
默认情况下,avars(cls)空类的
带有三个描述符:\uuuuu dict\uuuuu
用于存储实例的属性,\uuuuuukref\uuuuu
在内部由weakref
使用的\uuuu doc\uuuuu
类的docstring。如果您定义了\uuuuu slot\ucode>,那么前两个描述符就不存在了__
和\uuuuu weakref\uuuuu
属性,但是每个插槽都有一个单独的类属性。这样实例的属性就不会存储在字典中,而对它们的访问将由类中相应的描述符提供
最后,A.\uuuu dict\uuuu
与A.\uu dict\uuuu[''.\uu dict\uuuu']
的不一致性是因为属性\uu dict\uuuuu
在变量(A)中例外地从未查找过
,因此它的正确性实际上并不适用于您使用的任何其他属性。例如,A.\uuuuuweakref\uuuuu
与A.\uuuuuuu dict\uuuuu['\uuuuuuuuuuuuuuuweakref\uuuuuuuuu']
是一样的。如果不存在这种不一致性,使用A.\uuuuuuuuuu dict\uuuuuuuuuuu dict\uuuuuu
将不起作用,您必须始终使用vars(A)
相反。首先A.\uuuuu dict\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>不同于A
。前者不存在,而后者是类的实例将具有的\uuuuuuuuuuuuuuuuuuuuuu
属性。它是一个数据描述符对象,返回特定实例的内部属性词典。简言之,对象的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>属性不能存储在对象的中,所以它是通过类中定义的描述符访问的
要理解这一点,你必须阅读
简短版本:
对于类a
的实例a
,访问a.\uuu dict\uuuu
由a.\uu dict\uuuuuu[']
提供,它与vars(a)[\uu dict\uuu']相同
对于类a
,访问a.\uu dict\uuu
由类型提供。\uu dict\uuuuu['']
(理论上)与变量(类型)[''\uu dict\u']相同。
长版本:
类和对象都通过属性操作符(通过类或元类的\uuu getattribute\uuuu
实现)和\uuuu dict\uuu
属性/协议(由vars(ob)
使用)提供对属性的访问
对于普通对象,\u dict\u
对象创建一个单独的dict
对象,该对象存储属性,并且\u getattribute\u
首先尝试访问
>>> class A(object): pass
...
>>> A.__dict__
<dictproxy object at 0x173ef30>
>>> A.__dict__.__dict__
Traceback (most recent call last):
File "<string>", line 1, in <fragment>
AttributeError: 'dictproxy' object has no attribute '__dict__'
>>> A.__dict__.copy()
{'__dict__': <attribute '__dict__' of 'A' objects> ... }
>>> A.__dict__['__dict__']
<attribute '__dict__' of 'A' objects> # What is this object?
>>> A.__dict__['__dict__']
<attribute '__dict__' of 'A' objects>
>>> type(A.__dict__['__dict__'])
<type 'getset_descriptor'>
>>> type(A.__dict__["__dict__"]).__dict__
<dictproxy object at 0xb7efc4ac>
>>> A.__dict__['__dict__'].__objclass__, A.__dict__['__dict__'].__name__
(<class '__main__.A'>, '__dict__')
>>> getattr(A.__dict__['__dict__'].__objclass__, A.__dict__['__dict__'].__name__) == A.__dict__
True
>>> class A(object): pass
...
>>> a = A()
>>> type(A)
<type 'type'>
>>> type(a)
<class '__main__.A'>
>>> type(a.__dict__)
<type 'dict'>
>>> type(A.__dict__)
<type 'dictproxy'>
>>> type(type.__dict__)
<type 'dictproxy'>
>>> type(A.__dict__['__dict__'])
<type 'getset_descriptor'>
>>> type(type.__dict__['__dict__'])
<type 'getset_descriptor'>
>>> a.__dict__ == A.__dict__['__dict__'].__get__(a)
True
>>> A.__dict__ == type.__dict__['__dict__'].__get__(A)
True
>>> a.__dict__ == type.__dict__['__dict__'].__get__(A)['__dict__'].__get__(a)
True
>>> a.__dict__ == A.__getattribute__(a, '__dict__')
True
>>> A.__dict__ == type.__getattribute__(A, '__dict__')
True