Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 메타클래스와 상속 완벽 이해하기: 클래스 뒤에 숨은 비밀

파이썬에서 메타클래스란 무엇인가?

파이썬에서는 모든 것이 객체입니다. 흥미로운 점은 클래스 자체도 하나의 객체라는 사실입니다. 그렇다면 클래스는 무엇의 인스턴스일까요? 바로 메타클래스(metaclass)의 인스턴스입니다. 파이썬에서 기본 메타클래스는 type이며, 이를 isinstance() 함수로 직접 확인해볼 수 있습니다.

class Foo:
    pass

foo = Foo()

print(isinstance(foo, Foo))   # foo는 Foo의 인스턴스
print(isinstance(Foo, type))  # Foo 자체는 type(메타클래스)의 인스턴스

실행 결과:

True
True

즉, 일반 객체가 클래스의 인스턴스이듯, 클래스 그 자체는 메타클래스의 인스턴스인 셈입니다. 이러한 구조를 흔히 "모든 것은 객체다"라는 파이썬 철학을 보여주는 대표적인 예로 꼽습니다.

메타클래스와 상속의 차이점

메타클래스와 상속(기반 클래스)은 역할이 완전히 다릅니다. 두 개념을 혼동하기 쉽지만, 다음과 같은 핵심 차이가 있습니다.

  • 상속 관계: 기반 클래스(base class)는 객체의 클래스 계층 구조에 포함됩니다. isinstance()issubclass()로 확인되는 일반적인 상속 체계에 속합니다.
  • 메타클래스: 메타클래스는 객체의 클래스 계층 구조에 속하지 않습니다. 대신 클래스 자체를 생성하고 초기화하는 역할을 담당합니다.

쉽게 말해, 상속은 "객체가 어떤 설계도에서 만들어지는가"에 관한 것이고, 메타클래스는 "설계도(클래스) 자체가 어떻게 만들어지는가"에 관한 것입니다.

커스텀 메타클래스 만들어보기

파이썬 3에서는 클래스를 정의할 때 metaclass 키워드 인자를 사용해 커스텀 메타클래스를 지정할 수 있습니다.

class MyMeta(type):
    def __new__(mcs, name, bases, namespace):
        print(f"클래스 생성 중: {name}")
        return super().__new__(mcs, name, bases, namespace)

class Bar(metaclass=MyMeta):
    pass

# 출력: 클래스 생성 중: Bar

이처럼 메타클래스를 활용하면 클래스가 정의되는 시점에 동작을 개입시킬 수 있습니다. 실무에서는 ORM(예: Django 모델), API 등록, 싱글턴 패턴 강제, 속성 자동 검증 등 프레임워크 수준의 마법 같은 기능을 구현할 때 주로 사용됩니다.

정리

파이썬에서 클래스는 곧 객체이며, 그 객체의 타입이 바로 메타클래스(type)입니다. 메타클래스는 상속 계층과 달리 클래스의 생성 과정 자체를 제어하는 도구이며, 이를 이해하면 파이썬의 객체 모델을 한층 깊이 있게 파악할 수 있습니다. 더 심화된 내용은 Ionel Cristian Mărieș의 블로그 글 Understanding Python Metaclasses에서 확인할 수 있습니다.