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 등)를 개발할 때, 사용자가 작성한 클래스를 분석하고 변형하기 위해 사용됩니다.