반응형
메타클래스로 파이썬 클래스 작성을 한 단계 업그레이드하기
파이썬에서 모든 것이 객체라는 말이 있듯이, 클래스 자체도 객체입니다. 그리고 이 클래스 객체를 생성하는 것이 바로 메타클래스입니다. 메타클래스를 직접 정의하면 클래스 생성 프로세스 자체를 커스터마이징할 수 있습니다.
메타클래스란?
메타클래스는 클래스 객체를 생성하는 "클래스의 클래스"입니다. 파이썬의 type 클래스가 기본 메타클래스 입니다.
class MetaExample(type):
def __new__(cls, name, bases, attrs):
print(f"새 클래스 {name}이(가) 정의되었습니다.")
return super().__new__(cls, name, bases, attrs)
class MyClass(metaclass=MetaExample):
pass
# 새 클래스 MyClass가 정의되었습니다.
메타클래스 활용 사례
1. 속성 주입 - 클래스에 자동으로 속성을 추가
2. 인터페이스 적용 - 추상 메서드 강제 구현
3. 싱글톤 적용 - 단일 객체 인스턴스만 존재
4. 데이터 바인딩 - ORM 라이브러리
5. 프록시 생성 - 원격/가상 객체 접근
메타클래스 작성 예제
class NoInstanceAttrs(type):
def __new__(cls, name, bases, attrs):
new_attrs = {}
for k, v in attrs.items():
if not callable(v):
new_attrs[k] = v
return super().__new__(cls, name, bases, new_attrs)
class MyClass(metaclass=NoInstanceAttrs):
x = 1
def foo(self):
pass
obj = MyClass()
obj.x # AttributeError
이 메타클래스는 인스턴스 속성을 정의하지 못하도록 합니다. 속성은 클래스 속성으로만 허용됩니다.
메타클래스를 잘 활용하면 클래스 수준에서 강력한 기능을 추가할 수 있습니다. 하지만 메타클래스는 고급 기술이므로 과도한 사용은 피해야 합니다. 반드시 필요한 경우에만 적절히 활용하는 것이 좋습니다. 메타프로그래밍의 복잡성을 고려해 가독성과 유지보수성을 중요하게 생각해야 합니다.
반응형
'파이썬 기초문법' 카테고리의 다른 글
판다스 transform으로 그룹별 변환 적용하기(그룹별 최대값 / 최소값) (0) | 2024.06.12 |
---|---|
pandas apply로 데이터프레임 컬럼별 함수 적용하기 (0) | 2024.05.17 |
숨은 고수의 기술 - 파이썬 디스크립터(Descriptor)로 캡슐화 완성하기 (0) | 2024.05.12 |
동적 코드 생성과 실행으로 파이썬 프로그래밍의 힘 키우기(eval, exec) (1) | 2024.05.12 |
파이썬 데코레이터(decorator) 활용하기 (0) | 2024.05.12 |