我有以下代码:
if __name__ == '__main__':
module_name = sys.argv[1]
is_lite = sys.argv[2]
importlib.import_module(module_name)
for name, class_object in inspect.getmembers(sys.modules[module_name]):
if inspect.isclass(class_object) and not inspect.isabstract(class_object):
try:
print "\n\n\n"
print "Executing: "
print class_object
print "\n\n\n"
instance = class_object()
instance.execute(is_lite)
except:
pass
所有要实例化的对象实际上都是一个名为Foo的抽象类的子类。
inspect返回的class_objects包含模块中包含的所有类,这意味着导入也出现在列表中,并且导入不是Foo的子类。
class_object
我正在寻找的只是一种获取以下信息的方法:
是(class_object,Foo)
这将允许我摆脱try catch,并拥有更符合逻辑和健壮的代码。
但到目前为止,我什么也没有找到,似乎没有简单的方法来检索包含在inspect框架返回的模块中的信息。
我还试图使用内置的issubclass方法,但它失败了,可能是因为class_object不是该类的实例,而仅仅是它的一个描述符: class_object是abc.ABCMeta的实例,而不是Foo的实例,但将包含有关Foo的所有信息。
谢谢你的帮助。
发布于 2018-07-05 00:04:46
发布于 2018-07-12 04:59:32
到目前为止,我没有发现其他任何东西,只能这样做:
importlib.import_module(module_name)
for _, class_object in inspect.getmembers(sys.modules[module_name]):
if inspect.isclass(class_object) and not inspect.isabstract(class_object):
instance = None
try:
instance = class_object()
except:
pass
if instance is not None and isinstance(instance, AbstractBaseClass):
instance.execute(is_lite)
我找不到一种简单的方法来解析“class_object”内容并提取代表对象类名的字符串。
对于信息,'class_object‘返回如下所示
<class 'name of the actual class'>
classAttribute: value of the attribute
...
classMethod: <unbound method 'className'.'methodName'>
...
_abc_various_metadatas
https://stackoverflow.com/questions/51177493
复制相似问题