有沒有一種方法來攔截屬性調用鏈?在Python中訪問一個完整的屬性調用鏈
我的意思是這樣的:
myobj.attr1.attr2.{...}.attrN
我可以採用某種MyObj中內攔截整個產業鏈?
我想到的是一個函數,可以一次訪問完整鏈'attr1.{...}.attrN'
,例如作爲一個字符串。有沒有辦法確定這一點?
到目前爲止,我有一個相當哈克解決方案,其中getatrr創建新物體,其GETATTR還創建新物體並且由此整個屬性鏈(在全名以下)記錄爲一個字符串。但我不喜歡這個解決方案,因爲這有幾個缺點,特別是在酸洗和錯誤處理方面。
class NameCollector(object):
''' A helper class that resolves natural naming
'''
def __init__(self,myobj,name='',parent_name=''):
self._myobj=myobj
if name == '':
self._fullname = ''
elif parent_name == '':
self._fullname = name
else:
self._fullname = parent_name + '.' + name
def __getattr__(self,name):
new_collector = NameCollector(self._myobj,name,self._fullname, self._regexp)
if name in self._myobj._leaves:
return self._myobj._do_stuff_with_chained_attribute_names(new_collector)
return new_collector
歡呼和感謝, 羅伯特
將屬性視爲* name *的屬性而不是該名稱引用的對象的屬性的用例是什麼? – chepner