콘텐츠로 이동

MetaClass (메타클래스)

메타클래스(MetaClass)"클래스를 만드는 클래스"입니다. Python에서 모든 것은 객체(Object)이며, 클래스(Class) 자체도 하나의 객체입니다. 이 클래스 객체를 생성하는 주체가 바로 메타클래스입니다.

1. type

Python의 기본 메타클래스는 type입니다.

# 일반적인 클래스 정의
class MyClass:
    pass

# type을 이용한 동적 클래스 생성 (위와 동일)
# type(name, bases, dict)
MyClass = type('MyClass', (), {})

2. 사용자 정의 메타클래스

type을 상속받아 동작을 커스터마이징할 수 있습니다. 클래스가 생성되는 시점에 개입하여 검증하거나 속성을 자동으로 추가하는 등의 마법 같은(Magical) 일을 할 수 있습니다.

class SingletonMeta(type):
    _instances = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super().__call__(*args, **kwargs)
        return cls._instances[cls]

class Singleton(metaclass=SingletonMeta):
    pass

a = Singleton()
b = Singleton()
print(a is b)  # True

3. 언제 사용하는가?

일반적인 애플리케이션 개발에서는 거의 사용할 일이 없습니다. 주로 프레임워크나 라이브러리(Django ORM 등)를 개발할 때, 사용자가 작성한 클래스를 분석하고 변형하기 위해 사용됩니다.