你正在做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')
你需要搶班對象通過'globals()[classname]'; 'getattr'不會爲你找到它。考慮創建一個包含classname-> classobj值的字典,因此您不必擔心通過「globals」。 –
你必須使用實例作爲第一個參數,而不是字符串。 – Daniel
'seconds'不是'秒''。一個字符串代表文本,而不是一個類或其他名字恰好與存儲在字符串中的文本相匹配的其他名稱。 – user2357112