2017-03-29 134 views
0

我不斷收到以下錯誤嘗試使用「GETATTR」時:gettar屬性錯誤 - Python的

AttributeError的:「海峽」對象有沒有屬性「displayTime」

這裏是我的代碼使用:

getattr(className,"displayTime")(self) 

,其中「類名」指的是,我已經從清單中獲取,也是一個子類,我在我的節目名稱的字符串。 「displayTime」是該子類中的一個方法。

我試圖通過直接輸入查詢的子類的名稱爲它來測試它:

getattr(seconds,"displayTime")(self) 

,這工作得很好。有沒有人有任何想法我做錯了什麼?

謝謝。

+2

你需要搶班對象通過'globals()[classname]'; 'getattr'不會爲你找到它。考慮創建一個包含classname-> classobj值的字典,因此您不必擔心通過「globals」。 –

+3

你必須使用實例作爲第一個參數,而不是字符串。 – Daniel

+0

'seconds'不是'秒''。一個字符串代表文本,而不是一個類或其他名字恰好與存儲在字符串中的文本相匹配的其他名稱。 – user2357112

回答

0

你正在做getattr正確。你的問題是,你需要從一個字符串轉換爲一個對象 - 在這種情況下,對對象的引用。

有兩種識別類的方法。首先,您可以使用他們的父模塊識別它們,如abc.ABCMeta。爲此,請從sys.modules字典開始,查找模塊和子模塊(即:查找'abc')。然後你將會有一個模塊,它的名字的後半部分('ABCMeta')作爲它的一個孩子。您可以使用getattr從模塊中提取孩子,然後再次使用getattr來獲得您想要的任何成員。

import sys 
mod = sys.modules['abc'] 
cls = getattr(mod, 'ABCMeta') 
method = getattr(cls, 'displayTime') # Won't work, not available on class 

第二種方法是假設你在你使用的任何模塊的全局命名空間中都有一個名稱。例如,如果你不喜歡的東西:

from abc import ABCMeta as chicken 

然後,您可以指一個全球性的符號,chicken,在你的代碼,這將意味着同樣的事情。在這種情況下,如果你有已經完成的導入,可以簡單地查找'chicken'globals()詞典,如@Jim Fasarakis希利亞德的評論所說:

clsname = 'chicken' 
cls = globals()[clsname] 
method = getattr(cls, 'displayTime')