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
    是一个特殊的代理对象,假装是一个字典(但可能不是内部的),不允许您更改它或将其替换为另一个。除其他外,此代理允许您访问特定于该类且未在其某个基中定义的类的属性

    默认情况下,a
    vars(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