파이썬/기초 프로그래밍

파이썬 메타클래스(Metaclass) 완전 정리

Data Jun 2025. 9. 15. 10:04

1. 메타(Meta)라는 말의 뜻

  • **“한 단계 위에서 바라본다”**는 의미
  • IT에서 "메타"는 보통 **데이터를 설명하는 데이터(메타데이터)**처럼 “상위 개념”을 가리킬 때 씁니다.

그렇다면, 메타클래스클래스를 설명하고 제어하는 클래스입니다

 

1. 객체, 클래스, 메타클래스 관계

파이썬에서 모든 것은 객체입니다.

  • 객체(Object): 데이터와 기능을 가지는 실체
  • 클래스(Class): 객체를 만드는 설계도
  • 메타클래스(Metaclass): 클래스를 만드는 설계도

즉 구조는 이렇게 됩니다:

객체 → 클래스로부터 생성
클래스 → 메타클래스로부터 생성

 

2. 객체, 클래스, 메타클래스 관계 (순서도)

파이썬에서의 관계를 한 눈에 볼 수 있도록 순서도로 표현하면 아래와 같습니다.

[메타클래스(Metaclass)]
        ↓  클래스를 만든다
[클래스(Class)]
        ↓  객체(인스턴스)를 만든다
[인스턴스(Instance, Object)]
  • 메타클래스클래스를 만드는 공장
  • 클래스객체를 만드는 설계도
  • **객체(인스턴스)**는 클래스에서 실제로 찍어낸 결과물

 

3. 기본 메타클래스는 type

파이썬에서는 모든 클래스가 기본적으로 type의 인스턴스입니다.

class Foo:
    pass

print(type(Foo))  # <class 'type'>

Foo라는 클래스도 사실은 type이라는 메타클래스가 만들어낸 "객체"예요.
즉, 우리가 객체를 만드는 것처럼, 클래스도 만들어지는 대상일 뿐입니다.

 

4. 메타클래스를 왜 쓸까?

  • 클래스 생성 과정을 제어하고 싶을 때
  • 자동 규칙 적용: 속성 강제, 인터페이스 체크
  • 프레임워크 내부 동작: Django ORM, ABC(Abstract Base Class) 등

예를 들어, Django에서는 models.Model의 메타클래스를 이용해 데이터베이스 테이블과 모델 클래스를 자동으로 연결합니다.

 

간단한 예제

# 메타클래스 정의
class Meta(type):
    def __new__(cls, name, bases, dct):
        print(f"{name} 클래스가 생성됩니다!")
        return super().__new__(cls, name, bases, dct)

# 메타클래스를 사용하는 클래스
class MyClass(metaclass=Meta):
    pass

# 실행 결과:
# MyClass 클래스가 생성됩니다!

MyClass가 정의되는 순간, Meta라는 메타클래스가 개입해 메시지를 출력합니다.

 

 

 

정리하면

  • 객체는 클래스의 인스턴스
  • 클래스는 메타클래스의 인스턴스
  • 파이썬의 기본 메타클래스는 type
  • 필요하면 type을 상속해 직접 만든 커스텀 메타클래스를 사용할 수 있다

메타클래스는 “클래스를 제어하고 만드는 클래스”다.
프레임워크나 라이브러리에서 자주 활용되지만, 일반적인 개발에서는 직접 정의할 일은 드뭅니다. 대신 “클래스도 객체고, 그 뒤에는 type이 있다”는 철학만 이해해도 큰 도움이 됩니다.