2017-10-05 22 views
2
>>> 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'對象的`<attribute'xxx'是什麼意思在`C .__ dict__`的輸出中?

  • 做的C'C' objects平均情況?
  • 確實<attribute 'xxx' of 'C' objects>的意思是xxxC實例的一個屬性?但它被列爲C.__dict__作爲C的屬性。

爲什麼不<attribute 'xxx' of 'C' objects>提到C一些屬性(例如__doc____module__),而另一些?


回覆: 「注:<attribute ..>基本上是這些描述符的再版」

爲什麼沒有在下面的示例所示<attribute ..>

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

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

,如果你認爲'C .__類的輸出這個問題就更加有趣__.__ dict__' – Guillaume

+1

我注意到@Tim那你經常添加致歡迎詞句話你的問題。雖然在與某人面對面交談時這當然被認爲是禮貌的,但它只會給Stack Overflow上的帖子增加噪音。請參閱[_why是老鄉用戶刪除感謝你從我的問題是?_](https://meta.stackoverflow.com/questions/328379/why-are-fellow-users-removing-thank-yous-from-my-問題)瞭解更多詳情。 –

回答

3

這些PyGetSetDescrObjects其被計算爲類C的實例屬性(C實現的描述符)。 Documentation on these是最小的(或者我似乎無法找到:-)它,但是,你可以看看tp_getset in the C-API,討論一些關於這些:

struct PyGetSetDef* PyTypeObject.tp_getset

可選指針一個靜態的PyGetSetDef結構的以NULL結尾的數組,聲明此類型實例的計算屬性

對於數組中的每個條目,將一個條目添加到包含getset描述符的類型字典(請參閱下面的tp_dict)中。

的對象沒有<attribute ..>(注:<attribute ..>基本上是這些描述符的repr)根本就沒有描述符(__doc__通常是,如果同時持有__module__的名稱沒有定義字符串或None在其中定義類的模塊)。


回覆: 「注:<attribute ..>基本上是這些描述符的再版」

爲什麼沒有在下面的示例所示<attribute ..>

爲了解決我錯過的更新。

因爲這是一個在Python中實現的描述符並且從object繼承了默認的repr

C中實施的PyGetSetDescrObjectrepr函數使用不同的repr,主要是爲了區分它們(我會假設)。

+0

謝謝。 「注意:''屬性''基本上就是這些描述符的再現」。 爲什麼'<屬性..>'不中我更新我的帖子的例子所示? – Tim

+0

@Tim我剛剛注意到了更新,對不起。我已經更新了我的答案,以擴展您的問題。 –