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 가 발생합니다. 두 메타클래스를 모두 상속하는 새 메타클래스를 만들어야 합니다.
Continue Learning
Python 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.