Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-如何获取内部类的列表?_Python_Python 2.7_Python 3.x_Inner Classes_Metaclass - Fatal编程技术网

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

我正在编写一个包含几个嵌套类的小型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 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
,您不会看到来自超类的任何属性。检查我的答案。