>>> class C:
...     pass
...
>>> C.__dict__
mappingproxy({'__doc__': None,
'__weakref__': <attribute '__weakref__' of 'C' objects>,
'__dict__': <attribute '__dict__' of 'C' objects>,
'__module__': '__main__'})


<attribute 'xxx' of 'C' objects>中,


'C' objects是指C的实例吗?
<attribute 'xxx' of 'C' objects>表示xxxC实例的属性吗?但是它被C.__dict__列为C的属性。


为什么在__doc__中没有提及__module__的某些属性(例如C<attribute 'xxx' of 'C' objects>),而另一些则没有?



回复:“注意:<attribute ..>基本上是这些描述符的代表”

为什么在以下示例中未显示<attribute ..>

>>> class md:
...     def __get__(self, obj, owner):
...         return 3
...

>>> class CC:
...     d=md()
...
>>> CC.__dict__
mappingproxy({'d': <__main__.md object at 0x7f7387f8c978>, ...})

最佳答案

这些是PyGetSetDescrObjects,它们是类C实例的计算属性(用C实现的描述符)。 Documentation on these是最小的(或者我似乎找不到它:-),但是,您可以看一下tp_getset in the C-API,其中涉及到这些:


  struct PyGetSetDef* PyTypeObject.tp_getset
  
  指向以NULL结尾的静态PyGetSetDef结构数组的可选指针,声明此类型实例的计算属性。
  
  对于数组中的每个条目,都会将一个条目添加到包含getset描述符的类型的字典中(请参见下面的tp_dict)。


没有<attribute ..>的对象(注意:<attribute ..>基本上是这些描述符的repr)不是描述符(__doc__通常是字符串,或者None如果在__module__保持时未定义的话)定义类的模块的名称)。




  回复:“注意:<attribute ..>基本上是这些描述符的代表”
  
  为什么在以下示例中未显示<attribute ..>


为了解决我错过的更新。

因为这是用Python实现的描述符,并且从repr继承了默认的object

repr中实现的PyGetSetDescrObjectC函数使用不同的repr,主要是为了区分它们(我假设)。

关于python - “C .__ dict__”输出中的“<C对象的<xxx属性> xxx”是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46586958/

10-15 09:53