Python 获取从模块中的特定类派生的类

Python 获取从模块中的特定类派生的类,python,python-2.7,superclass,Python,Python 2.7,Superclass,我需要从仅从特定TargetClass派生的模块中获取类: import mymodule as t for att in dir(t): someclass = getattr(t, att) if isinstance(someclass, TargetClass): print ("Do something with %s" % att) 嗯。。。这不起作用,所以如果模块的属性不可调用,我需要创建实例并捕获异常: import mymodule as t for

我需要从仅从特定TargetClass派生的模块中获取类:

import mymodule as t
for att in dir(t):
   someclass = getattr(t, att)
   if isinstance(someclass, TargetClass):
       print ("Do something with %s" % att)
嗯。。。这不起作用,所以如果模块的属性不可调用,我需要创建实例并捕获异常:

import mymodule as t
for att in dir(t):
   someclass = getattr(t, att)
   try:
       if isinstance(someclass(), TargetClass):
           print ("Do something with %s" % att)
   except:
       pass

那么,如何从mymodule中仅获取这些类,即某些TargetClass的子类,而不创建实例和捕获异常?

您可以使用
issubclass
而不是
isinstance
, 但本质上你会遇到同样的问题,因为
issubclass
的第一个参数必须是一个类。因此,您可以将它们结合起来:

import mymodule as t
for att in dir(t):
   someclass = getattr(t, att)
   if isinstance (someclass, type) and issubclass(someclass, TargetClass):
       print ("Do something with %s" % att)

您可以使用
issubclass
而不是
isinstance
, 但本质上你会遇到同样的问题,因为
issubclass
的第一个参数必须是一个类。因此,您可以将它们结合起来:

import mymodule as t
for att in dir(t):
   someclass = getattr(t, att)
   if isinstance (someclass, type) and issubclass(someclass, TargetClass):
       print ("Do something with %s" % att)

无论如何都需要捕捉异常:因为它可能引发类似“issubclass()arg 1必须是一个类”:@RaSergiy我想我在发布答案后不久的编辑中解释了这一点。还是我遗漏了什么?也许你是想评论另一个答案:)isinstance(someclass,type)不起作用,必须有实例:isinstance(someclass(),type)。。。因此,无论如何都要创建对象……我认为只有issubclass可以捕获异常。@RaSergiy不,我认为
isinstance(someclass,type)
可以工作,但只能在新样式的类上工作,因为旧样式的类不是
type
的实例,而是
classobj
。不过,尝试并捕获异常并没有什么不好的。但请避免在未指定预期异常类型的情况下使用
except
。无论如何都需要捕获异常:因为它会引发类似“issubclass()arg 1必须是一个类”:@RaSergiy我想我在发布答案后不久的编辑中解释了这一点。还是我遗漏了什么?也许你是想评论另一个答案:)isinstance(someclass,type)不起作用,必须有实例:isinstance(someclass(),type)。。。因此,无论如何都要创建对象……我认为只有issubclass可以捕获异常。@RaSergiy不,我认为
isinstance(someclass,type)
可以工作,但只能在新样式的类上工作,因为旧样式的类不是
type
的实例,而是
classobj
。不过,尝试并捕获异常并没有什么不好的。但请避免在未指定预期异常类型的情况下使用
except