2013-08-19 7 views
7

파이썬 모듈의 모든 클래스를 이름이없는 객체의 목록으로 초기화하는 방법이 있습니까?모듈의 모든 클래스를 목록의 이름이없는 객체로 초기화하십시오.

나는 클래스 규칙에서 모든 하위 클래스를 포함하는 모듈 rules 있습니다. 그 때문에, 나는 확신하기 때문에 그들은 모든 방법 run()을 구현하고 나는 동적으로 해당 클래스에서 시작된 개체의 목록을 가지고 싶습니다 __init__

의 통화 중에 생성 될 속성 name있을 것이다. 동적으로 초기화된다는 것은 명시 적으로 이름을 지정할 필요가 없다는 것을 의미합니다.

질문은 다음과 같습니다

이 모듈의 모든 클래스를 통해 반복 할 수 있습니까?

이름이없는 개체를 시작할 수 있습니까?

답변

8

적어도 두 가지 방법이 있습니다. 클래스의 __subclasses__() 메서드를 호출하여 클래스의 모든 하위 클래스를 가져올 수 있습니다.

rule_list = [cls() for cls in Rule.__subclasses__()] 

이것은 Rule 당신에게 모든 서브 클래스를 제공하고 특정 모듈에있는 사람에게 제한되지 않습니다 : 부모 클래스가 Rule라고 그래서 만약, 당신이 호출 할 수 있습니다.

모듈에 대한 핸들이있는 경우 해당 내용을 반복 할 수 있습니다. 그래서 같이 :

import rule 
rule_list = [] 
for name in dir(rule): 
    value = getattr(rule, name) 
    if isinstance(value, type) and issubclass(value, Rule): 
     rule_list.append(value()) 

불행하게도, issubclassTypeError을 던져 당신이 그것을 첫 번째 인자로 클래스가 아닌 객체를 제공합니다. 어떻게 든 처리해야합니다.

편집 : @ Blckknght의 제안에 따라 issubclass 버릇을 다루기.

+0

내 대답보다 낫습니다. 'inspect.isclass()'를 사용하여'TypeError'를 피할 수 있습니다. –

+0

@AntonisChristofides 사실,'inspect.isclass()'를 필터로 사용할 수 있습니다. 그러나 프로덕션 코드에서'inspect' 모듈을 사용하는 것을 피하려고합니다. –

+0

'isinstance (value, type)'를 사용하여 클래스가 있는지 확인할 수도 있습니다. (예전 스타일의 클래스를 지원해야한다면'types.ClassType'을 검사해야하지만, 대신에 그것들을 피할 것입니다.) – Blckknght

관련 문제