2011-02-01 1 views
11

매개 변수 x이 전달 된 함수를 만들고 새로운 클래스 C을 반환합니다. C은 고정 기본 클래스 A의 서브 클래스 여야하며 하나만 추가됩니다. 특정 클래스 속성이 추가되고 x과 동일하게 설정됩니다. 즉python 3 : class "template"(매개 변수화 된 클래스를 반환하는 함수)

:

class C(A): 
    C.p = x # x is the parameter passed to the factory function 

는 할이 쉽게 사용할 수 있나요? 내가 알아야 할 문제가 있습니까?

답변

9

먼저 "클래스 팩토리"라는 용어는 파이썬에서 다소 쓸모가 없습니다. C++과 같은 언어에서 클래스의 동적 입력 인스턴스를 반환하는 함수에 사용됩니다. C++에서 두드러지기 때문에 이름이 있습니다. 드문 일은 아니지만 패턴에 이름을 지정하면 유용합니다. 그러나 파이썬에서는이 작업이 끊임없이 수행됩니다. 아무도 특별한 이름을 지정하지 않아도되는 기본적인 작업입니다.

또한 클래스 팩토리는 클래스 자체가 아닌 클래스의 인스턴스를 반환합니다. (다시 말하지만 C++과 같은 언어의 클래스 전용 객체를 반환하는 개념이 없기 때문입니다.) 그러나 클래스의 새 인스턴스가 아니라 "새로운 클래스"를 반환하고자한다고했습니다.

는 로컬 클래스를 생성하고 반환하는 사소한 :

def make_class(x): 
    class C(A): 
     p = x 
    return C 
+0

감사합니다. 내 질문에서 'factory'에 대한 참조를 제거했습니다. 이 함수를 사용하면 이름 충돌에 문제가 있거나 함수가 반환 할 때 'C'를 잊어 버릴 수 있습니까? – max

+0

위의 설명에서 말했듯이, 이름이 기록 된 두 개의 * 장소가 있습니다. Glenn의 예에서 이름 "C"는 클래스의 내부 이름 (클래스의 영구 속성)과 로컬 변수 이름 "C"입니다. 함수가 반환 될 때까지 지역 변수 "C"는 잊어 버리지 만 클래스는 내부 이름 "C"를 유지합니다. 그러나 위에서 말했듯이 내부 클래스 이름에 대해서는 이름 충돌이 없으므로 문제가되지 않습니다. – mgiuca

+0

클래스 자체는 단순히 객체입니다. 그것은 'C = 1; C '를 반환하십시오. ("C"라는 이름은 객체에'C .__ name__'으로 저장되어 있지만 디버깅과 코스메틱 목적으로 만 사용됩니다.) –

5

type 함수에는 새로운 클래스를 동적으로 생성하는 3- 인수 버전이 있습니다. 이름을, 기지dict에 전달하고 클래스의 속성 및 메소드를 포함합니다.

귀하의 경우

: 당신은 분명히 동적 클래스의 이름을 설정할 수 있습니다

def class_factory(x): 
    return type("C", (A,), {"p": x}) 

, "C"하지만 당신은 또한의 결과를 할당해야합니다, 클래스가 공개적으로 액세스 할 수 있도록하기 위해 점에 유의 변수에 대한 함수. globals()["C"] = ...을 사용하여 동적으로 처리하거나 클래스를 사전에 할당 할 수 있습니다.

+1

출몰하고, 아니. 클래스를 원하면 클래스를 정의하십시오. –

+0

다른 매개 변수로 함수를 호출 할 때 이름 충돌이 발생하지 않습니까? 나는 그것을 피하기 위해 클래스 이름에 여분의 텍스트를 추가해야 할 필요가있을 것입니다. – max

+0

@Glenn Maynard 흥미 롭습니다. 나는 이것들을 시험해 보았다. 그리고 그들은 양쪽 다 거의 같은 물건을 만드는 것처럼 보인다. 어떤 것이 더 나은지는 말할 수 없습니다. 동적으로 클래스를 작성했기 때문에 제 방식이 더 깨끗해 보입니다. 클래스를 동적으로 생성하도록 설계된 함수를 호출 할 수도 있습니다. 클래스의 * 이름 * 또는 파생 된 * 기본 * 클래스를 동적으로 사용자 정의하고 싶다면 Glenn의 메소드가 작동하지 않으므로 더 일반적입니다. 어쨌든,이 예제를 정확하게 사용하여 "유형"이 어떻게 작동하는지 보여주는 매뉴얼 (위 링크)을 살펴 보겠습니다. – mgiuca