파이썬의 메타클래스는 다른 클래스를 생성하는 클래스입니다. 클래스가 객체의 템플릿이라면, 메타클래스는 클래스를 생성하는 템플릿입니다. 이를 통해 클래스를 생성하고 수정하는 방법을 프로그래밍적으로 정의할 수 있습니다.
파이썬에서는 모든 것이 객체이며, 여기에는 클래스도 포함됩니다. 이는 클래스 생성, 수정, 제어의 로직을 생성 단계에서 정의할 수 있게 해줍니다. 비슷한 메커니즘이 다른 언어에서도 사용되었지만, 파이썬에서는 메타클래스 메커니즘을 통해 특히 간단하고 우아하게 구현되었습니다.
가끔 큰 프로젝트에서 클래스는 특정 규칙에 따라 구축되거나 필수 메서드 및 속성을 포함해야 하거나 정의할 때 자동으로 수정되어야 합니다. 메타클래스 없이는 이로 인해 코드 중복과 오류가 발생할 수 있습니다.
메타클래스를 사용하면 클래스 타입의 메서드인 new 및 __init__을 재정의하여 클래스 생성을 수정할 수 있습니다. 메서드와 속성을 자동으로 추가하고 구조를 검증하며 리플렉션을 적용할 수 있습니다.
class UpperAttrMeta(type): def __new__(cls, name, bases, dct): new_attrs = {} for key, value in dct.items(): if not key.startswith('__'): new_attrs[key.upper()] = value else: new_attrs[key] = value return super().__new__(cls, name, bases, new_attrs) class Foo(metaclass=UpperAttrMeta): bar = 'bip' print(hasattr(Foo, 'bar')) # False print(hasattr(Foo, 'BAR')) # True
metaclass를 통해 사용됨클래스 생성 후 인스턴스의 메타클래스를 변경할 수 있는가? 안됩니다. 클래스가 생성된 후에는 메타클래스를 변경할 수 없습니다. 인스턴스는 해당 클래스에 정의된 메타클래스를 사용합니다.
메타클래스와 클래스 데코레이터의 차이점은 무엇인가? 클래스 데코레이터는 클래스가 생성된 후에 클래스를 변경할 수 있지만, 메타클래스는 생성 과정 자체를 관리하며 클래스 생성 금지나 기본 클래스 변화도 가능하게 합니다.
모든 클래스는 자체 메타클래스를 가져야 하는가?
아닙니다. 보통은 표준 type을 사용하며, 메타클래스는 기본 동작을 변경해야 할 때만 필요합니다.
장점:
부정적인 사례: 초보 아키텍트가 간단한 작업 (예: str 자동 생성)을 위해 메타클래스를 사용하기 시작함. 장점: 새로운 도구를 익혔음. 단점: 팀에 불필요한 마법을 주입하여 버그 발생.
긍정적인 사례: 복잡한 ORM에서 파이썬 클래스를 기반으로 테이블을 자동 생성하기 위해 메타클래스를 사용함. 장점: 구조의 중앙 집중식 제어, 매핑의 자동 업데이트. 단점: 상세한 문서화 및 새로운 팀원 교육이 필요했음.