2013-06-05 3 views
1

여러 클래스를 정의하고이를 목록으로 반환하는 팩토리 함수가 있습니다. 클래스가 정의 된 순서대로 나타나는 목록을 얻을 수 있습니까?정의 된 순서대로 범위에있는 객체 가져 오기

다음 팩토리는 범위에 정의 된 클래스를 얻기 위해 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'>] 
+2

아니, 소스 코드를 introspecting 그에서 순서를 추측하지 않고. 왜 특정 주문을해야합니까? –

+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'>] 
+0

감사합니다. 이것은 유망한 것으로 들립니다. 작은 예를 들어 보자. –

+0

@MatthewPlourde 간단한 공장의 예를 추가했습니다. – Ber

+0

우수합니다. 감사합니다. –