gettar属性错误-Python

gettar属性错误-Python,python,python-3.x,getattr,Python,Python 3.x,Getattr,在尝试使用“getattr”时,我不断遇到以下错误: AttributeError:“str”对象没有属性“displayTime” 以下是我正在使用的代码: getattr(className,"displayTime")(self) 其中“className”指的是我从列表中提取的字符串,也是我在程序中拥有的子类的名称。“displayTime”是该子类中的一个方法 我试图通过将子类的名称直接输入到它来测试它: getattr(seconds,"displayTime")(

在尝试使用“getattr”时,我不断遇到以下错误:

AttributeError:“str”对象没有属性“displayTime”

以下是我正在使用的代码:

    getattr(className,"displayTime")(self)
其中“className”指的是我从列表中提取的字符串,也是我在程序中拥有的子类的名称。“displayTime”是该子类中的一个方法

我试图通过将子类的名称直接输入到它来测试它:

    getattr(seconds,"displayTime")(self)
这很有效。有人知道我做错了什么吗


谢谢。

您正确地执行了
getattr
。您的问题是需要将字符串转换为对象—在本例中,是对类对象的引用

有两种方法可以识别类。首先,您可以使用它们的父模块来识别它们,比如
abc.ABCMeta
。要做到这一点,请从系统模块字典开始,查找模块和子模块(即:查找“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
,它的含义是相同的。在这种情况下,如果您已经完成了导入,您只需在
globals()
字典中查找
'chicken'
,正如@Jim Fasarakis Hilliard在评论中所建议的:

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

您需要通过
globals()[classname]
获取类对象
getattr
无法为您找到它。考虑创建一个包含CordNeX-CaseObjv值的字典,这样就不必担心遍历 Guulals。您必须使用实例作为第一个参数,而不是字符串。<代码>秒不是<代码>“秒”< /代码>。字符串表示文本,而不是名称与字符串中存储的文本匹配的类或任何其他对象。