2010-01-15 5 views
3

저는 현재 파이썬을 배우고 있으며 강력한 C# 배경에서 왔습니다. 언어의 동적 인 특성과 내가 얻은 것과 그렇지 않은 것의 일부를 활용하기 위해 Pythonic 방식으로 일을하는 것에 대해 계속 듣고 있습니다.장고 (Django)보기에 클래스를 사용하는 것은 Pythonic입니까?

장고를 사용하여 사이트를 만들고 있는데 내 접근 방식은 클래스를 사용하는 것입니다. 내 현재의 생각은 사용하는 템플릿과 모델에 대한 몇 가지 사항을 가진 기본 클래스를 갖는 것이다. 그러면 사이트 검색을 포함한 기본 펑키 404 유형 페이지가 생기고 다른 모든 페이지를 기반으로합니다. 따라서 사이트의 각 영역마다 고유 한 EG News와 모든 모델 관련 함수가 있으며 필터링은 HTML 또는 AJAX 요청에 대한 추가 클래스가있는 해당 클래스에 있습니다. 그래서 당신은이 같은 것이다 :

\ 사이트 \ 공통 \ ViewBase

- \ 뉴스 \의 NewsBase (ViewBase)

- \ 소식 \ HtmlView (NewsBase)

- \ 뉴스 \의 AJAXView (NewsBase는)

URL은 site.news.htmlview하는 http://tld/news/latest지도와 같은 매핑 될 것이며 http://tld/news/는//도 site.news.htmlview를 매핑 할 것이다 것이 아니라 클래스가 수행 할 작업을 알아낼 것이다 추가 매개 변수.

이것은 C#에서 할 수있는 일이지만 Django 튜토리얼은 뷰를위한 메소드 사용만을 보여 주며 이것이 매우 파이썬적인 해결책이 아닌지 궁금하게 생각합니까?

생각하십니까?

편집 : 스레드 안전성에 대한 S.Lott 주석 후, 함수를 그대로두고 클래스의 인스턴스를 만들고 메서드를 호출하게하는 것이 더 좋습니까?

는 내가 찾던 등

+1

모델의 테이블에서 작동하는 코드는 ** 관리자 ** http://docs.djangoproject.com/ko/1.1/topics/db/managers/ –

+0

에 입력해야합니다. Pythonic이 아닐까요 ... 나는 그 질문이 Djangoic인지 아닌지 의심 스럽습니다. – JAL

답변

4

확실히보기의 클래스를 사용하여 아무 문제가 없습니다, 제공하는 사이트의 모델, 인증을 필터링하는 사이트의 각 섹션에 대해 공통의 코드를 삽입 할 수있는 장소입니다 URL을 클래스의 실제 인스턴스로 라우트하고 클래스를 직접 라우트하지는 않습니다.

+4

개체의 인스턴스 변수를 매우 조심하십시오. Django는 멀티 스레드 일 수 있으며 스레드로부터 안전하다고 믿을 수있는 유일한 변수는 요청과 로컬입니다. 객체의 인스턴스 변수는 ** thread safe가 아닌 **로 간주되어야합니다. –

+0

감사합니다. 클래스를 호출 가능하게 만드는 것에 대한 블로그 게시물을 꽤 많이 보았습니다. 매우 편안합니다. –

+0

Callable is easy. 그것은 문제가되는 인스턴스 변수입니다. 인스턴스 변수를 사용하지 않으면 '__call__'만 사용할 때 클래스를 만드는 이유가 무엇이겠습니까? 왜 기능을하지 않습니까? –

2

Django 관리자는 django/contrib/admin의 소스 코드를 정확하게 보았습니다.

클래스의 장점은 사용자 정의가 훨씬 쉽다는 것입니다 (예 : 사용 권한 확인을 위해 후크를 추가 할 수 있음).

모든 기존 제네릭 뷰를 클래스로 이동하라는 제안이 있지만 1.2에 도달했지만 마감일을 지키지 못했습니다.

위의 포스터에서 지적했듯이 인스턴스 변수를 처리 할 때는 매우주의해야합니다. 관리 클래스를 살펴보면 "self"에 의존하지 않고 다양한 방법으로 요청이 전달되는 것을 볼 수 있습니다.

0

다른 문제 (스레드 안전 문제 등)를 제외하고 모델/뷰/템플릿간에 밝은 선을 통과 할 수있는 위험이 있습니다.

또는 어쩌면 URL 디스패치 (not that there's anything wrong with that :-)를 대신 할 수 있습니다. 확실하지는 않지만 단지 에서 약간 느껴집니다..

0

클래스 기반보기가 유용하지만 상속이이 특정 작업에 적합한 도구가 아닐 수도 있습니다. 헬퍼 함수와 데코레이터는 뷰에서 공통 코드를 제외하는 두 가지 좋은 방법입니다. 그들은 또한 코드에 대해 작업 할 수있는 다른 (파이썬) 코드 작성자에게보다 친숙하고 자연스러운 경향이 있습니다.

당신이 궁극적으로 고려해야 할 부분을 모르겠으니 최선의 방법이 무엇인지 모르겠다. 상속 외에 파이썬을 고려하는 다른 방법이 있다는 것을 명심하라.

p.s. pythonic 솔루션을 찾는 것에 대한 명성.

관련 문제