python-如何获取内部类的列表?
我正在编写一个包含几个嵌套类的小型Python应用程序,如下例所示:python-如何获取内部类的列表?,python,python-2.7,python-3.x,inner-classes,metaclass,Python,Python 2.7,Python 3.x,Inner Classes,Metaclass,我正在编写一个包含几个嵌套类的小型Python应用程序,如下例所示: class SuperBar(object): pass class Foo(object): NAME = 'this is foo' class Bar(SuperBar): MSG = 'this is how Bar handle stuff' class AnotherBar(SuperBar): MSG = 'this is how Anothe
class SuperBar(object):
pass
class Foo(object):
NAME = 'this is foo'
class Bar(SuperBar):
MSG = 'this is how Bar handle stuff'
class AnotherBar(SuperBar):
MSG = 'this is how Another Bar handle stuff'
我使用嵌套类来创建某种层次结构,并提供一种干净的方法来实现解析器的功能
在某个时候,我想创建一个内部类的列表。我希望有以下输出:
[<class '__main__.Bar'>, <class '__main__.AnotherBar'>]
[,]
问题是:以pythonic方式获取内部类列表的推荐方法是什么?我使用以下方法获取了内部类对象列表:
import inspect
def inner_classes_list(cls):
return [cls_attribute for cls_attribute in cls.__dict__.values()
if inspect.isclass(cls_attribute)
and issubclass(cls_attribute, SuperBar)]
它可以工作,但我不确定直接使用
\uu dict\uuu
是否是一件好事。我之所以使用它,是因为它包含了我需要的实际的类
实例,并且似乎可以跨Python 2和3移植。首先:我看不出嵌套类对您有什么用处。一旦您拥有Foo
的实例f
,您是否意识到f.Bar
和f.AnotherBar
对于所有实例都是相同的对象?也就是说,您不能在f.Bar
上记录任何特定于f
的属性,比如f.Bar.speed
,否则它将与另一个实例g.Bar.speed
中的属性冲突
要克服这一点,实际上,唯一有意义的是,您需要将Bar
的实例和另一个Bar
附加到实例f
。这些实例通常不能在类主体上声明-您必须在Foo的\uuuu init\uuu
方法上创建它们
Bar和ArtherBar唯一能做的就是:(1)拥有大量的类和静态方法,然后它们只能作为名称空间工作
或者,如果SuperBar
的元类或者它们自己实现了描述符协议——但是如果SuperBar
本身实现了描述符prootocol(通过让\uuuuuu get\uuuuuuu
或\uu set\uuuuuuuuuuu
方法)并附加到Foo的主体上,你会有这些类的实例,那就更好了,不是班级本身
也就是说,您提供了使用\uuuu dict\uuu
获取内部类的解决方案:如果Foo
本身继承了其他也有嵌套类的类,那么这将不起作用。从不搜索Foo
的超类。您可以使用一种方法查看Foo的\uu mro\uu
上的所有类,或者只需使用dir
和issubclass
:
class Foo:
@classmethod
def inner_classes_list(cls):
results = []
for attrname in dir(cls):
obj = getattr(cls, attrname)
if isinstance(obj, type) and issubclass(obj, SuperBar):
results.append(obj)
return results
(如果您想让它适用于所有不共享公共基的类,如Foo,那么如果它被声明为类方法,那么同样的代码也可以使用,当然,如果您有多个嵌套类层次结构,SuperBar
可以作为此函数的参数。)
现在你有了这个,我们敦促你问一些其他的问题,比如你到底想做什么——并阅读关于“描述符”甚至“属性”的内容。真的:嵌套子类几乎没有什么用处 一,。为什么要嵌套类,您能提供更多的上下文吗?2.难道你不想要超级条的所有子类吗(在这种情况下请参见)?这是不够的。在实际应用程序中,我有更多的根类,如
Foo
,还有更多的内部类来完成解析树。我还需要强制执行找到的给定标记(如Bar
)来自根标记Foo
的上下文。为了捕捉这种层次结构,我使用了这些内部类感谢他们提供更多的上下文。你可能试图解决完全错误的问题。是的-你可以使用dict-它是更常见的地方,并且使用嵌套类使用thna但是有一个问题是,通过查看\uuu dict\uuu
,您不会看到来自超类的任何属性。检查我的答案。