PHpullh
학습 라이브러리/Python/__init_subclass__

PYTHON · 객체지향

__init_subclass__

__init_subclass__로 클래스가 상속될 때 자동으로 실행되는 로직을 정의합니다. 메타클래스보다 간단합니다.

객체지향고급__init_subclass__메타클래스플러그인등록

핵심 설명

__init_subclass__로 클래스가 상속될 때 자동으로 실행되는 로직을 정의합니다. 메타클래스보다 간단합니다.

Python code

class Plugin:
    """플러그인 자동 등록 시스템"""
    _registry: dict[str, type] = {}

    def __init_subclass__(cls, *, name: str = "", **kwargs):
        super().__init_subclass__(**kwargs)
        reg_name = name or cls.__name__.lower()
        Plugin._registry[reg_name] = cls
        print(f"플러그인 등록: {reg_name}")

    @classmethod
    def get_plugin(cls, name: str):
        return cls._registry.get(name)

    @classmethod
    def list_plugins(cls):
        return list(cls._registry.keys())

class JSONPlugin(Plugin, name="json"):
    def process(self, data):
        return f"JSON: {data}"

class XMLPlugin(Plugin, name="xml"):
    def process(self, data):
        return f"XML: {data}"

class CSVPlugin(Plugin):  # name 생략 → 클래스명 사용
    def process(self, data):
        return f"CSV: {data}"

print(Plugin.list_plugins())  # ['json', 'xml', 'csvplugin']
plugin = Plugin.get_plugin("json")()
print(plugin.process({"key": "value"}))

학습 팁

__init_subclass__는 메타클래스 없이 서브클래스 생성을 가로채는 가장 간단한 방법입니다.

주의할 점

__init_subclass__에서 super().__init_subclass__(**kwargs)를 호출하지 않으면 다중 상속 시 체인이 끊어집니다.

자주 묻는 질문

__init_subclass__란 무엇인가요?

__init_subclass__ 로 클래스가 상속될 때 자동으로 실행되는 로직을 정의합니다. 메타클래스보다 간단합니다.

__init_subclass__ 학습 시 주의할 점은 무엇인가요?

__init_subclass__ 에서 super().__init_subclass__(**kwargs) 를 호출하지 않으면 다중 상속 시 체인이 끊어집니다.