2009-01-27 28 views
3

爲什麼編碼器將東西填入__dict__不能用於屬性訪問?例如,在我的Plone實例中,dir(portal)包含index_html,但portal.index_html引發了AttributeError。對於Products.ZCatalog.Catalog.mybrains__class__屬性也是如此。 dir()不能被信任是否有充分的理由?爲什麼dir(x)中的所有名稱都不適用於屬性訪問?

嘲笑inspect模塊,我看到他們使用object.__dict__['x']而不是屬性訪問,因爲這個原因,並且他們不想觸發getattr魔法。

回答

2

我不知道Plone,所以下面是一般。

dirthe docs

如果對象有一個名爲 __dir__()方法,這個方法將被調用,必須返回 屬性列表。這允許對象執行定製__getattr__()__getattribute__()函數來定製dir()報告它們的 屬性的方式。

只是猜測這裏,但我能想到的兩件事情,可能是happening--

  • 對象具有__dir__()方法返回的屬性,它並沒有

  • (不太可能)對象您要求的屬性(即它在obj.__dict__type(obj).__dict__,但是覆蓋__getattr__返回AttributeError

編輯__dir__只支持在Python 2.6+,但是(不建議使用)特殊屬性__methods____members__可以用來代替早期版本。

+0

`__dir__`是Python 2.6中的新增功能,並且IIRC Zope仍然不能運行在比Python 2.4更新的任何東西上。 – habnabit 2009-01-28 02:55:12

相關問題