Django(1.6)의 Form 관련 소스코드를 보다가 헷갈려서 django.forms.forms.py에서 여러 코드 조각을 발췌하여 Django에서 메타클래스가 어떻게 사용되는지 분석해봤습니다.
def with_metaclass(meta, *bases): """Create a base class with a metaclass.""" return meta("NewBase", bases, {}) class DeclarativeFieldsMetaclass(type): def __new__(cls, name, bases, attrs): print('cls: %s, name: %s, bases: %s ,attrs: %s\n' % (cls, name, bases, attrs)) new_class = super(DeclarativeFieldsMetaclass, cls).__new__(cls, name, bases, attrs) # new_class._meta = '123' return new_class class BaseForm(object): pass class Form(with_metaclass(DeclarativeFieldsMetaclass, BaseForm)): pass class MyForm(Form): a = 1 b = 2
위의 Python 모듈을 로드하면 콘솔에 다음이 출력됩니다.
cls:
cls:
cls:
코드에서 MyForm에 대한 메타클래스가 직접 지정되지는 않았지만 MyForm은 Form에서 상속되고 Form은 DeclarativeFieldsMetaclass에 의해 생성된 "NewBase"라는 클래스에서 상속되므로 DeclarativeFieldsMetaclass는 실제로 MyForm의 메타클래스입니다.