2010-07-16 4 views
9

이것은 another question의 질문에 대한 답입니다.Django 추상 모델 대 간단한 Python 믹스 vs Python ABCs

장고는 Abstract base classes 기능 (파이썬에서 ABC 클래스와 같지 않음)을 제공하여 상속받을 수있는 모델 (Django의 models.Model)을 만들 수 있지만 모델에 실제 테이블이있는 모델은 만들지 않습니다. 데이터 베이스. 하나는 모델의 메타 클래스에 '추상'속성을 설정하여이 동작을 트리거합니다.

이제 질문 : 장고가 왜이 방법으로이를 해결합니까? 이 특별한 종류의 '추상 기본 클래스'모델이 필요한 이유는 무엇입니까? 왜 객체 클래스에서 상속 받고 기존 모델과 혼합하여 Model mixin을 만들지 않겠습니까? 또는 파이썬 ABC에 대한 작업으로이 작업을 수행 할 수 있습니까?

상식은이 쉽게 긴 통렬한 비난의 연설로 변신 할 수 있기 때문에,

답변

11

내가 합리적으로 간단한 될하려고합니다 (마음 당신은 내가 파이썬에서 ABC 클래스에 익숙하지 않아요, 나의 무지는 여기에 표시 할 수 있습니다) Django 개발자는 Python 버전 지원을위한 로드맵을 가지고 있습니다 (2.3 지원은 1.2에서만 삭제되었습니다).

오브젝트를 상속하는 믹스 인은 가독성을 줄이는 것보다 여러 가지 방법으로 피톤 틱을 덜 사용합니다. Django는 Model 개체에 대해 ModelBase 메타 클래스를 사용합니다.이 개체는 실제로 초기화시 정의 된 모델 속성을 분석하고 Model._meta 필드, Meta 옵션 및 기타 속성으로 채 웁니다. 두 모델 유형 모두에서 해당 프레임 워크를 재사용하는 것이 좋습니다. 또한 장고는 상속 모델에 의해 추상 모델 필드가 오버라이드되는 것을 막을 수 있습니다.

내가 생각할 수있는 더 많은 이유가 있지만 그 중 일부는 모두 자체적으로 중요하지 않지만 현재 구현을 훨씬 더 Pythonic으로 만들기 위해 추가됩니다. 객체를 상속하는 믹스 인을 사용하는 것은 근본적으로 잘못된 것이 아닙니다.

+0

(Daniel 's도 좋지만 Aram은 더할 나위없이 좋았습니다.) 오브젝트를 상속하는 믹스 인을 사용하여 모델에 추가 필드를 선언 하시겠습니까? 하지만 추가 메서드를 추가하거나 재정의 할 수 있습니까? – hopla

+0

예, 개체를 상속 한 mixins은 추가 필드와 메서드를 선언 할 수 있습니다. 상속받은 클래스 목록에서 먼저 객체를 상속받은 믹스 인이 먼저 오는지 확인하여 메소드를 오버라이드 할 수 있습니다. 그러나 순서에 관계없이 객체를 상속하는 mixin은 필드를 재정의 할 수 없습니다 (시도하더라도 유효성을 검사하지는 않습니다). –

6

이유 중 하나는 필드가 모델에 정의 된 방식 때문입니다.

필드는 일반 클래스가 클래스 속성으로 취급하는 방식으로 선언적으로 지정됩니다. 그러나 클래스가 실제로 인스턴스화 될 때 인스턴스 속성이되어야하므로 각 인스턴스는 각 필드에 대해 고유 한 값을 가질 수 있습니다. 이것은 metaclass를 통해 관리됩니다. 이것은 일반적인 추상 기본 클래스에서는 작동하지 않습니다.