>백엔드 개발 >파이썬 튜토리얼 >Django의 메타클래스

Django의 메타클래스

高洛峰
高洛峰원래의
2016-10-17 14:03:101519검색

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: , name: NewBase, bases: (,) , 속성: {}

cls: , 이름: 양식, 기본: (,), 속성: {'__module__': '__main__'}

cls: , 이름: MyForm, 기본: (,), 속성: {'a': 1, '__module__': '__main__', 'b': 2}

코드에서 MyForm에 대한 메타클래스가 직접 지정되지는 않았지만 MyForm은 Form에서 상속되고 Form은 DeclarativeFieldsMetaclass에 의해 생성된 "NewBase"라는 클래스에서 상속되므로 DeclarativeFieldsMetaclass는 실제로 MyForm의 메타클래스입니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.