파이썬에서 클래스도 객체라는 사실, 알고 계셨나요?
우리는 보통 class 키워드를 써서 클래스를 정의하지만,
사실 내부적으로는 **메타클래스 type**이 클래스 생성을 담당합니다.
따라서 type()을 직접 사용하면, 런타임에 새로운 클래스를 동적으로 만들 수 있습니다.
1. type의 기본 구조
type() 함수는 두 가지 역할을 합니다.
- type(obj) → 객체의 타입(클래스)을 반환
- type(name, bases, dict) → 새로운 클래스를 생성
두 번째 형태가 바로 동적 클래스 생성의 핵심입니다.
type(name, bases, dict)
- name: 클래스 이름 (문자열)
- bases: 상속할 부모 클래스(튜플)
- dict: 속성과 메서드를 정의한 딕셔너리
2. 기본 예시: 빈 클래스 만들기
class Sample1(object):
pass
s1 = type('Sample1', (), {})
print(s1) # <class '__main__.Sample1'>
여기서 Sample1과 s1은 사실상 동일한 클래스입니다.
즉, class 키워드와 type()은 같은 결과를 만들어내는 서로 다른 표현일 뿐입니다.
3. 상속과 속성 추가하기
class Parent1:
pass
class Sample2(Parent1):
attr1 = 100
attr2 = 'hi'
s2 = type('Sample2', (Parent1,), dict(attr1=100, attr2='hi'))
- Sample2는 Parent1을 상속받습니다.
- attr1, attr2 속성도 함께 정의됩니다.
class Sample2와 type() 방식 모두 같은 결과를 만들어냅니다.
4. 메서드까지 포함한 클래스 생성
class SampleEx:
attr1 = 30
attr2 = 100
def add(self, m, n):
return m + n
def mul(self, m, n):
return m * n
s3 = type(
'Sample3',
(object,),
dict(
attr1=30,
attr2=100,
add=lambda self, x, y: x + y,
mul=lambda self, x, y: x * y
)
)
- attr1, attr2 속성 추가
- add, mul 메서드도 함께 정의
s3는 SampleEx와 똑같은 기능을 하는 동적 클래스입니다.
5. 실제 활용 사례
동적 클래스 생성은 일상적인 개발보다는 프레임워크나 라이브러리 내부 구현에서 자주 활용됩니다.
- ORM (Django, SQLAlchemy 등)
모델 클래스를 정의하면 자동으로 데이터베이스 테이블에 매핑 - 플러그인 시스템
실행 시점에 새로운 클래스를 등록하거나 주입 - 코드 생성 자동화
반복되는 클래스를 코드 작성 없이 동적으로 생성
6. 주의할 점
- type()을 이용한 동적 생성은 강력하지만 가독성을 떨어뜨릴 수 있습니다.
- 잘못 사용하면 디버깅이 어렵고, IDE 자동 완성도 지원받기 힘들 수 있습니다.
- 일반적인 경우에는 class 키워드로 정의하는 게 훨씬 직관적입니다.
정리하면
- class 키워드 없이도 type()으로 클래스를 만들 수 있다.
- name, bases, dict 세 가지 인자로 클래스 정의가 가능하다.
- 동적 클래스를 활용하면 런타임에 유연하게 객체를 설계할 수 있다.
- 다만 실무에서는 주로 프레임워크 내부 로직에서 쓰이고, 일반 코드에서는 남용하지 않는 게 좋다.
type()은 단순히 객체의 타입을 확인하는 함수가 아니라, 클래스를 만드는 메타클래스입니다.
이 특성을 이용하면 런타임에 새로운 클래스를 동적으로 생성할 수 있고, 이는 파이썬의 “모든 것이 객체다”라는 철학을 잘 보여줍니다.
'파이썬 > 기초 프로그래밍' 카테고리의 다른 글
| 파이썬 Descriptor와 Property 비교 예제 (0) | 2025.09.15 |
|---|---|
| 파이썬 메타클래스로 커스텀 리스트 만들기 (0) | 2025.09.15 |
| 파이썬 메타클래스(Metaclass) 완전 정리 (0) | 2025.09.15 |
| 파이썬에서의 메소드 오버로딩 (multipledispatch 활용) (0) | 2025.09.14 |
| 파이썬 언더스코어(_)의 의미와 활용 (0) | 2025.09.14 |