我有一個類,它定義了自己的__getattr__()
以便與實例化對象包含的XML樹進行交互。這隱藏了用戶的XML結構,並允許他設置標籤值等,就好像它們是對象上的普通字段,並且適用於除一個之外的所有字段:名爲field
的字段。以下是它的外觀:爲什麼Python尋找__members__而不是請求的字段?
>>> q = MyQuery()
>>> q.file = "database"
>>> print(q)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<requestCollection xmlns="http://dwd.de/sky">
<read>
<select>
<referenceDate>
<value></value>
</referenceDate>
</select>
<transfer>
<file name="my file"/>
</transfer>
</read>
</requestCollection>
>>> q.file
工作正常,應該發生的副作用是這樣做的。但是,如果我嘗試設置字段field
,則會得到該方法不應返回的字符串。爲了清楚起見,這是我的__getattr__
一個簡化版本:
def __getattr__(self, key):
logging.info("Looking up value for key {}.".format(key))
if key == "something"
return self.method_with_side_effect(key)
if key in field_list:
logging.info("Key is in the field list.")
return self.other_method_with_side_effects(key)
ensemble_member
和field
都在field_list
。檢查了這一點:
>>> q = MyQuery()
>>> q.ensemble_member
Looking up value for key __members__.
Looking up value for key __methods__.
Looking up value for key ensemble_member.
Key is in the field list.
... Side effects ...
>>> q.field
'station'
Looking up value for key __members__.
Looking up value for key __methods__.
的行爲ensemble_member
是正確的,對於field
這是完全不正確的。這是爲什麼?
我沒有方法,也沒有類/對象成員名爲field
。
另一個有趣的事情是,如果我把這個對__getattr__
第一行:
def __getattr__(self, key):
if key == "field":
raise ValueError
下仍然發生:
>>> q = MyQuery()
>>> q.field
'station'
Looking up value for key __members__.
Looking up value for key __methods__.
這是怎麼回事?
請張貼演示該問題的一個小的可運行的例子。另外,你使用的是哪個版本的Python? –
你在某處叫「dir(q)」嗎? –
我不會在任何地方調用dir(q),儘管我只是試了一下,「field」就在那裏。我不確定它是如何到達那裏的。 –