2009-03-06 4 views
6

나는 이런 식으로 파이썬에서 클래스를 해킹했습니다 : 나에게 꽤 깨끗한 보이는파이썬 메타 클래스

def hack(f,aClass) : 
    class MyClass(aClass) : 
    def f(self) : 
     f() 
    return MyClass 

A = hack(afunc,A) 

합니다. 클래스 A를 가져 와서 f를 호출 한 새로운 클래스를 만들고 f를 호출 한 다음 A를 새 클래스에 다시 할당합니다.

이것은 Python에서 메타 클래스 해킹과 어떻게 다른가요? 메타 클래스을 사용하는 이점은 무엇입니까?

+0

왜 이렇게 했습니까? –

답변

5

파이썬에서 클래스의 정의는 유형의 인스턴스 (또는 유형의 서브 클래스의 인스턴스)입니다. 즉, 클래스 정의 자체가 하나의 객체입니다. 메타 클래스를 사용하면 클래스 정의가되는 유형 인스턴스를 제어 할 수 있습니다.

메타 클래스가 호출되면 클래스 정의를 완전히 다시 쓸 수 있습니다. 클래스, 조상 등 제안 된 모든 속성에 액세스 할 수 있습니다. 메소드를 삽입하거나 메소드를 제거하는 것 이상으로 상속 트리, 유형 및 거의 모든 다른 측면을 근본적으로 변경할 수 있습니다. 아주 역동적이고 완전히 뒤죽박죽 된 경험을 위해 메타 클러를 함께 연결할 수도 있습니다.

클래스의 유형이 클래스의 유형으로 남아 있지만 실제로 이점이 있다고 가정합니다. 당신의 예에서, 입력 :

a_inst = A() 
type(a_inst) 

그것이 MyClass의 인스턴스가 있음을 보여줍니다. 예, isinstance(a_inst, aClass)True을 반환하지만 동적으로 다시 정의 된 클래스가 아닌 하위 클래스를 도입했습니다. 아마도 열쇠가있을 것입니다.

rjh가 지적했듯이 익명의 내부 클래스는 성능과 확장 성을 의미합니다. 메타 클래스는 한 번만 처리되며 클래스가 정의 된 순간에 다시 처리되지 않습니다. API 사용자는 함수 내에 포함되어 있지 않으므로 메타 클래스를 확장 할 수 있으므로 어느 정도의 확장 성을 얻을 수 있습니다.

이 약간 오래된 문서는 실제로 정확히 메타 클래스와 예에서 사용 된 "기능 장식"접근 방식을 비교하는 좋은 설명이 있고, 그 맥락에서 파이썬 메타 클래스 진화의 역사를 보여줍니다 http://www.ibm.com/developerworks/linux/library/l-pymeta.html

1

type도 사용할 수 있습니다.

def hack(f, aClass): 
    newfunc = lambda self: f() 
    return type('MyClass', (aClass,), {'f': newfunc}) 

본인은 메타 클래스의 세계에 들어갈 type 가장 쉬운 방법을 사용하여 찾을 수 있습니다.