파이썬 기초문법

메타클래스로 파이썬 클래스 작성을 한 단계 업그레이드하기

Family in August 2024. 5. 12. 12:25
반응형


메타클래스로 파이썬 클래스 작성을 한 단계 업그레이드하기


파이썬에서 모든 것이 객체라는 말이 있듯이, 클래스 자체도 객체입니다. 그리고 이 클래스 객체를 생성하는 것이 바로 메타클래스입니다. 메타클래스를 직접 정의하면 클래스 생성 프로세스 자체를 커스터마이징할 수 있습니다.


메타클래스란?

메타클래스는 클래스 객체를 생성하는 "클래스의 클래스"입니다. 파이썬의 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



이 메타클래스는 인스턴스 속성을 정의하지 못하도록 합니다. 속성은 클래스 속성으로만 허용됩니다.

메타클래스를 잘 활용하면 클래스 수준에서 강력한 기능을 추가할 수 있습니다. 하지만 메타클래스는 고급 기술이므로 과도한 사용은 피해야 합니다. 반드시 필요한 경우에만 적절히 활용하는 것이 좋습니다. 메타프로그래밍의 복잡성을 고려해 가독성과 유지보수성을 중요하게 생각해야 합니다.

반응형