Mike 와 Alex의 충고를 더 반영 하고 나만의 색상을 추가합니다.
인스턴스 속성을 사용하는 것이 일반적입니다 ... 더 관용적 인 Python입니다. 클래스 속성은 사용 사례가 구체적이기 때문에 많이 사용되지 않습니다. 정적 및 클래스 메서드와 "일반"메서드의 경우에도 마찬가지입니다. 그것들은 특정한 사용 사례를 다루는 특별한 구조이고, 그렇지 않으면 파이썬 프로그래밍의 모호한 부분을 알고 있음을 보여주고 싶어하는 비정상적인 프로그래머가 만든 코드입니다.
Alex는 자신의 답변에서 조회 수준이 한 단계 줄어들 기 때문에 액세스가 (조금) 더 빨라질 것이라고 언급했습니다. 아직 이것이 어떻게 작동하는지 모르는 사람들을 위해 더 자세히 설명하겠습니다. 변수 액세스와 매우 유사하며 검색 순서는 다음과 같습니다.
- 지역 주민
- 비 현지인
- 글로벌
- 내장
속성 액세스의 경우 순서는 다음과 같습니다.
- 예
- 수업
- MRO에 의해 결정된 기본 클래스 (메소드 확인 순서)
두 기술 모두 "인사이드 아웃 (inside-out)"방식으로 작동합니다. 즉, 대부분의 로컬 객체가 먼저 확인 된 다음 외부 레이어가 연속적으로 확인됩니다.
위의 예에서 path
속성을 찾고 있다고 가정 해 보겠습니다 . " self.path
" 와 같은 참조를 발견하면 Python은 먼저 인스턴스 속성에서 일치 항목을 찾습니다. 실패하면 개체가 인스턴스화 된 클래스를 확인합니다. 마지막으로 기본 클래스를 검색합니다. Alex가 말했듯이 인스턴스에서 속성이 발견되면 다른 곳을 볼 필요가 없으므로 약간의 시간이 절약됩니다.
그러나 클래스 속성을 고집하는 경우 추가 조회가 필요합니다. 또는 , 다른 대안은, 예를 들어, 클래스 대신 인스턴스를 통해 객체를 참조하는 MyController.path
대신 self.path
. 이것은 지연된 조회를 우회하는 직접 조회이지만 alex가 아래에서 언급했듯이 전역 변수이므로 저장할 것이라고 생각했던 비트를 잃게됩니다 ([global] 클래스 이름에 대한 로컬 참조를 생성하지 않는 한 ).
결론은 대부분의 경우 인스턴스 속성을 사용해야한다는 것입니다. 그러나 클래스 속성이 작업에 적합한 도구 인 경우가 있습니다. 두 가지를 동시에 사용하는 코드는 가장 많은 노력이 필요합니다 .을 사용하면 동일한 이름의 클래스 속성에 대한 self
인스턴스 속성 개체와 섀도우 액세스 만 얻을 수 있기 때문 입니다. 이 경우 속성을 참조하려면 클래스 이름으로 속성 액세스 를 사용해야 합니다.