2011-10-15 51 views
2

所以在我的代碼GETATTR玩弄我發現了以下內容:的Python - GETATTR和串聯

myVariable = foo.A.bar 

作品......但這樣的事情:

B = "A" 
myVariable = getattr(foo, B + ".bar") 

返回一個錯誤,FOO不包含屬性A.bar。我哪裏錯了?謝謝!

回答

11

因爲foo上沒有屬性A.bar。屬性bar是由A指向的對象的一部分,它是foo的屬性。您需要用

getattr(foo.A, "bar") 

getattr(getattr(foo, 'A'), 'bar') 

訪問深屬性的通用代碼是分割的點,並且去,直到最後被發現(我是從內存寫作,沒有測試):

def getattr_deep(start, attr): 
    obj = start 
    for part in attr.split('.'): 
     obj = getattr(obj, part) 
    return obj 

getattr_deep(foo, 'A.bar') 
+0

感謝您爲我澄清這一點! – Bitrex

2

的當量:

myVariable = foo.A.bar 

使用getattr將需要2個步驟。

aObject = getattr(foo, 'A') 
myVariable = getattr(aobject, 'bar') 

你的方式做`MYVARIABLE = GETATTR(FOO,B + 「的.bar」) 手段 'MYVARIABLE = GETATTR(FOO, 「B.bar」)' GETATTR現在查找字符串「B.酒吧「顯然不存在。