按照定义的顺序获取范围内的对象

时间:2013-06-05 15:34:48

标签: python

我有一个工厂函数,它定义了几个类并在列表中返回它们。是否有可能获得这样一个列表,其中类按照它们的定义顺序出现?

以下工厂使用locals()来获取其范围中定义的类,但locals()返回一个字典,因此没有明确的排序。

import inspect

def factory() :
    class Base(object):
        pass

    class A(Base):
        pass

    class B(Base):
        pass

    class C(Base):
        pass

    local_classes = [obj for obj in locals().values() if inspect.isclass(obj)]
    return [cls for cls in local_classes if issubclass(cls, Base)]

factory()
# [<class '__main__.A'>, <class '__main__.Base'>, <class '__main__.C'>, <class '__main__.B'>]

所需的输出是

# [<class '__main__.Base'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>]

1 个答案:

答案 0 :(得分:1)

我偶然遇到过这个问题。我的解决方案通常使用类装饰器将每个类显式添加到工厂。

我通常使用工厂类的实例作为工厂。但是,如果您认为从列表派生的简单工厂类可能足以实现您的目标:

class Factory (list):
    def append(self, cls):
        super(Factory, self).append(cls)
        return cls

factory = Factory()

@factory.append
class Base (object):
    pass

@factory.append
class A (Base):
    pass

@factory.append
class B (Base):
    pass
print factory

运行此产生:

[<class '__main__.Base'>, <class '__main__.A'>, <class '__main__.B'>]