>>> 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>
表示xxx
是C
实例的属性吗?但是它被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>, ...})
最佳答案
这些是PyGetSetDescrObject
s,它们是类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
中实现的PyGetSetDescrObject
的C
函数使用不同的repr
,主要是为了区分它们(我假设)。
关于python - “C .__ dict__”输出中的“<C对象的<xxx属性> xxx”是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46586958/