PHpullh
학습 라이브러리/Python/메타클래스 & __init_subclass__

PYTHON · 객체지향

메타클래스 & __init_subclass__

클래스 생성 과정을 제어하는 메타클래스와 더 간단한 대안을 배웁니다.

객체지향고급metaclass__init_subclass__singletonregistrytype

핵심 설명

클래스 생성 과정을 제어하는 메타클래스와 더 간단한 대안을 배웁니다.

Python code

# __init_subclass__ — 메타클래스보다 간단
class Plugin:
    _registry: dict = {}

    def __init_subclass__(cls, name: str = "", **kwargs):
        super().__init_subclass__(**kwargs)
        if name:
            Plugin._registry[name] = cls

class MarkdownPlugin(Plugin, name="markdown"):
    def render(self, text): return f"<p>{text}</p>"

class HtmlPlugin(Plugin, name="html"):
    def render(self, text): return text

print(Plugin._registry)
# {'markdown': MarkdownPlugin, 'html': HtmlPlugin}

plugin = Plugin._registry["markdown"]()
print(plugin.render("Hello"))

# 간단한 메타클래스
class SingletonMeta(type):
    _instances = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super().__call__(*args, **kwargs)
        return cls._instances[cls]

class AppConfig(metaclass=SingletonMeta):
    def __init__(self):
        self.debug = False

c1 = AppConfig()
c2 = AppConfig()
print(c1 is c2)   # True — 같은 인스턴스

학습 팁

메타클래스는 강력하지만 복잡합니다. 대부분의 경우 __init_subclass__, @classmethod, dataclass로 해결 가능합니다.

주의할 점

메타클래스 충돌: 두 부모 클래스의 메타클래스가 다르면 TypeError가 발생합니다. 두 메타클래스를 모두 상속하는 새 메타클래스를 만들어야 합니다.

자주 묻는 질문

메타클래스 & __init_subclass__란 무엇인가요?

클래스 생성 과정을 제어하는 메타클래스와 더 간단한 대안을 배웁니다.

메타클래스 & __init_subclass__ 학습 시 주의할 점은 무엇인가요?

메타클래스 충돌: 두 부모 클래스의 메타클래스가 다르면 TypeError 가 발생합니다. 두 메타클래스를 모두 상속하는 새 메타클래스를 만들어야 합니다.