2011-03-18 7 views
30

나는 그것의 주장에서 파생 된 클래스를 생성하는 기능을 가지고 : 나는 새로운 클래스를 생성하는 데 사용할 이제클래스 이름을 동적으로 설정하는 방법은 무엇입니까?

def factory(BaseClass) : 
    class NewClass(BaseClass) : pass 
    return NewClass 

를, 클래스는 모두 같은 이름, 그들은 같은 유형이 같은 경우가보고되어 있습니다 :

NewA = factory(ClassA) 
NewB = factory(ClassB) 
print type(NewA()) # <class __main__.NewClass> 
print type(NewB()) # <class __main__.NewClass> 

__name__ 속성을 수동으로 설정하는 올바른 수정 프로그램이 있습니까?

NewA.__name__ = 'NewA' 
print type(NewA()) # <class __main__.NewA> 

내가 설정하는 동안 다른 설정을해야합니까?

답변

34

예, 설정하려면 __name__을 사용하십시오. 클래스 이름을 조정하기 위해 다른 것을 설정할 필요가 없습니다. 예를 들어

:

def factory(BaseClass) : 
    class NewClass(BaseClass): pass 
    NewClass.__name__ = "factory_%s" % BaseClass.__name__ 
    return NewClass 

type 여기에 사용하는 잘못된 것입니다. 파이썬의 일반적인 클래스 구문으로 클래스를 정의하는 대신, 모든 클래스 속성을 수동으로 설정하게합니다. 예를 들어 손으로 클래스를 만드는 데 사용됩니다. 기본 클래스의 배열을 가지고 있고 그것을 사용하여 클래스를 만들고 싶다면 (파이썬의 클래스 구문으로는 할 수 없다). 여기서 사용하지 마십시오.

7

세 인수를 사용하여 type() 함수를 사용하여 체크 아웃하십시오. 다음 코드에서는 object을 기본 유형으로 사용하고 초기 특성이없는 새로운 클래스 "NewA"를 만듭니다.

>>> type('NewA', (object,), {}) 
<class '__main__.NewA'> 
+0

NewClass의 클래스 정의가 매우 긴 경우 다소 복잡해 보입니다. 나는 모든 메소드를 사전에 모아야 만 할 것이다. (나는 doc 문자열이 키값''__doc __ ''아래에 있다고 가정한다). – kiyo

+0

또한 NewClass의 메소드가 BaseClass의 메소드를 동적으로 참조해야한다면? – kiyo

+0

'type'은 가변적 인 기본리스트를 가진 클래스를 생성하는 것과 같습니다. 이것에 대해서는 완전히 잘못된 도구입니다. –

관련 문제