인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

김영빈님의 프로필 이미지
김영빈

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

Django Form

class Meta에 대해 질문입니다.

작성

·

352

0

10:54의 내용을 10:57에 심플하게 바꿀 수 있다고 해주셨는데요

클래스 내부에 클래스가 들어잇는 문법을 처음봐서 찾아보려는데 키워드를 잘모르겠네요

혹시 '메타클래스'라는게 맞을까요? 이렇게 저렇게 찾아봐도 메타클래스에 관한 부분인 것 같긴한데, 또 찾는 자료들에서는 설명해주신 방식으로 메타클래스를 사용하는 걸 못봐가지구요

답변 1

0

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

클래스 안에 Meta 라는 이름의 클래스를 선언하는 것의 장고 만의 약속입니다. 클래스 안에 클래스를 선언하는 단순한 문법이며, 클래스 변수 문법을 통해 이해할 수 있습니다. 파이썬 고급 문법 중에 metaclass 문법와는 관련이 없습니다.

장고는 모델 클래스나 ModelForm 클래스에 대한 메타정보(설정)를 저장할 방법으로서 클래스 문법을 사용한 것 뿐입니다. 아래의 코드는 PostForm 클래스에 대한 메타정보로서 참조할 model 로서 Post 클래스를 사용하고, 참조할 fields는 ["title"] 를 참조하겠다는 일종의 선언입니다.

class Meta 는 클래스지만 인스턴스를 만드는 목적으로 사용하지는 않습니다. 클래스 변수로서만 사용합니다.

아래는 파이썬 클래스에서 var1 는 클래스 변수이며, var2 는 인스턴스 변수입니다. var1은 클래스 변수이기에 Person.var1 과 같이 접근할 수 있습니다.

위 PostForm 의 Meta 역시 PostForm 입장에서는 클래스 변수 공간에 Meta가 정의된 것입니다. 그래서 PostForm.Meta 형태로서 접근할 수 있습니다. PostForm.Meta.model 과 같은 접근도 가능하겠죠.

화이팅입니다. :-)

김영빈님의 프로필 이미지
김영빈
질문자

답변감사합니다. 덕분에 시간을 아낄 수 있었네요.

답변을 보니 여쭤보고 싶은 내용이 생겼는데요, 저러한 방식의 문법(중첩클래스라 부르겠습니다)이 클래스전체에서 통용되는 클래스변수를 선언하기 위함이라하면, 굳이 중첩클래스를 사용할 필요가 있나요? 그냥 클래스변수로서 바로 클래스내부에 바로 선언해주면 되는 것이 아닌지 궁금합니다.

이진석님의 프로필 이미지
이진석
지식공유자

PostForm.Meta.model 과 같은 형태는 2 depth 인데요. 클래스 변수로서 직접 세팅하는 것은 1 depth 씩 밖에 되질 않으니 더 번거로울 수 있습니다. 장고 내부적으로 getattr(new_class, "Meta", None) 과 같이 Meta 속성을 참조하고 있기도 하구요.

그리고 abstract 모델을 상속 시에 Meta 클래스를 상속받는 코드를 작성하기도 합니다.

김영빈님의 프로필 이미지
김영빈
질문자

감사합니다~

김영빈님의 프로필 이미지
김영빈

작성한 질문수

질문하기