[django] View 3 - MRO

Hyeseong·2020년 12월 23일
0

django

목록 보기
16/35

들어가기전

클래스마다 메소드를 찾는 순서를 정한 MRO Method Resolution Order 속성?!
다중상속이 가능한 파이썬이므로 둘 이상의 부모 클래스에 존재할 경우 어느 메소드를 먼저 사용해야 할지 결정하는 알고리즘이 바로 이거에요

MRO

ListView MRO

참고로 class Test(Hello, World)처럼 상속을 받을 경우 첫 번째 인자인 Hello클래스 다음에 World클래스 순서로 MRO가 정해저요.

또, 너비 우선 검색(breadth-first search)보단 깊이 우선 검색(depth-first-search)에 가까워요.

ListView.__mro__

입력

ListView.__mro__

출력,

$ ./manage.py shell
Python 3.8.6rc1 (tags/v3.8.6rc1:08bd63d, Sep  7 2020, 23:10:23) [MSC v.1927 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.views.generic import ListView
>>> ListView.__mro__
(<class 'django.views.generic.list.ListView'>, <class 'django.views.generic.list.MultipleObjectTemplateResponseMixin'>, <class 'django.views.generic.base.TemplateResponseMixin'>, <class 'django.views.generic.list.BaseListView'>, <class 'django.views.generic.list.Mul
tipleObjectMixin'>, <class 'django.views.generic.base.ContextMixin'>, <class 'django.views.generic.base.View'>, <class 'object'>)
>>>

다중 상속 어쩌라고?!

그래서 이 상속 받은 클래스 뭐 어쩌라고?~! 라는 생각이 드셨다면! 당신은 잘 따라오고 있는 겁니다.

ListView 상위 클래스 설명

> Note! Mixin 클라쓰~~

대개 클래스의 용도와 달리, 믹스인 클래스는 자신의 인스턴스를 만드는 용도보다는 다른 클래스에게 부가 기능을 제공하기 위한 용도로 사용되는 클래스를 의미해요. django에서는 파이썬의 다중 상속 기능을 활용해 꼭 필요한 단위 기능들을 믹스인 클래스로 만들고, 제네릭 뷰에서 이런 믹스인 클래스들을 상속받는 방식으로 제네릭 뷰를 설계해요.

예. 모든 제네릭 뷰에선 템플릿 처리는 필수 기능인데, 템플릿 처리도 객체 하나일 때와 여러 객체일 떄 처리하는 과정이 다르조? 이를 별도의 믹스인 클래스로 만드는 방식이에요. 이렇게 설계하면 ListView와 DetailView에서 템플릿 처리를 위해 자신에게 필요한 믹스인 클래스만 상속받게 해서 코드 중복은 줄이고 재사용성은 높이는 Pythonic한 코드가 되겠쥬~?

> NOTE 클래스형 뷰 참고 사이트

클래스형 뷰를 설명하는 사이트들은 많아요. 그중에서 믹스인 클래스를 포함해 모든 클래스형 뷰를 설명하고 있고, 소스 코드뿐만 아니라 MRO를 쉽게 이해할 수 있도록 클래스 다이어그램까지 보여주는 좋은 사이트가 있습니다.

https:ccbv.co.uk/

profile
어제보다 오늘 그리고 오늘 보다 내일...

0개의 댓글