Django의 메타클래스

高洛峰
풀어 주다: 2016-10-17 14:03:10
원래의
1480명이 탐색했습니다.

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의 메타클래스입니다.


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿