파이썬/기초 프로그래밍

파이썬 메타클래스로 커스텀 리스트 만들기

Data Jun 2025. 9. 15. 11:13

파이썬에서 클래스는 사실 **메타클래스 type**에 의해 생성됩니다.
보통은 class 키워드로 선언해서 쓰지만, type()을 직접 호출하면 런타임에 클래스를 동적으로 만들 수 있죠.

이번 글에서는 type()을 활용해 **커스텀 리스트(Custom List)**를 만드는 과정을 살펴보겠습니다.

 

1. type()을 이용한 클래스 생성 복습

type()은 두 가지 방식으로 쓰입니다.

type(obj)   # 객체의 타입 확인
type(name, bases, dict)  # 새로운 클래스 생성
  • name: 클래스 이름 (문자열)
  • bases: 상속할 부모 클래스 (튜플)
  • dict: 클래스에 정의할 속성과 메서드 (딕셔너리)

즉, class 키워드로 선언하는 것과 type()을 이용한 선언은 결국 같은 일을 하게 됩니다.

 

2. 커스텀 메서드 만들기

먼저 리스트에 원하는 기능을 추가할 함수를 따로 정의합니다.

# 리스트의 모든 원소를 d배 해주는 함수
def cus_mul(self, d):
    for i in range(len(self)):
        self[i] = self[i] * d

# 리스트 안에서 특정 값을 다른 값으로 바꿔주는 함수
def cus_replace(self, old, new):
    while old in self:
        self[self.index(old)] = new

여기서 self는 나중에 CustomList1 객체가 될 리스트 자신입니다.

  • cus_mul → 리스트 요소 전체에 곱셈 적용
  • cus_replace → 리스트 안의 특정 값(old)을 새로운 값(new)으로 교체

 

3. 동적으로 클래스 정의하기

이제 type()을 사용해 list를 상속받는 커스텀 리스트 클래스를 만들어봅니다.

CustomList1 = type(
    'CustomList1',         # 클래스 이름
    (list,),               # 부모 클래스 (list 상속)
    {
        'desc': '커스텀 리스트1',   # 클래스 속성
        'cus_mul': cus_mul,        # 커스텀 메서드 1
        'cus_replace': cus_replace # 커스텀 메서드 2
    }
)

실제 사용 예시

# CustomList1 객체 생성
c1 = CustomList1([1,2,3,4,5,6,7,8,9,10])

# 모든 원소에 1000 곱하기
c1.cus_mul(1000)

# 리스트 안의 1000을 8777로 교체
c1.cus_replace(1000, 8777)

print(c1)

실행 결과:

[8777, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000]

 

4. 코드 흐름 정리

  • 객체 생성: [1, 2, …, 10] 리스트를 가진 CustomList1 객체 c1 생성
  • 곱하기 메서드 호출: cus_mul(1000) → 모든 원소가 1000배 커짐
[1000, 2000, 3000, …, 10000]

 값 교체 메서드 호출: cus_replace(1000, 8777) → 1000 → 8777로 바뀜

[8777, 2000, 3000, …, 10000]

 

5. 왜 이런 방식을 쓰나?

  • class 키워드를 써도 같은 기능을 구현할 수 있습니다.
  • 하지만 type()을 이용하면 런타임에 조건에 맞게 클래스를 생성할 수 있어,
    프레임워크(예: Django ORM, SQLAlchemy)나 메타프로그래밍 기법에서 자주 활용됩니다.

1️⃣ 예를 들어:

  • 모델 정의 시점에 자동으로 필드를 주입
  • 실행 상황에 따라 클래스를 동적으로 바꿔치기

이런 경우에 type() 방식이 큰 힘을 발휘합니다.

 

 

정리하면

  • type()은 단순히 타입 확인 함수가 아니라 클래스를 만드는 메타클래스
  • type(name, bases, dict)을 이용하면 동적으로 클래스 생성 가능
  • 이번 예제에서는 list를 상속받아 cus_mul, cus_replace 같은 메서드를 추가
  • 실행 결과, 우리가 정의한 커스텀 메서드를 활용해 리스트를 자유롭게 변형 가능

메타클래스(type)를 직접 활용하면 파이썬의 유연함과 런타임 동적 생성 능력을 실감할 수 있습니다.
일반 개발에서는 잘 쓰이지 않지만, 프레임워크나 라이브러리 구현에서는 아주 강력한 무기가 됩니다!