Python 클래스에서 메서드를 주문하는 좋은 방법은 무엇입니까?


89

Python 클래스에서 메서드를 주문하고 싶지만 올바른 순서가 무엇인지 모르겠습니다.

PyDev를 사용하여 Eclipse에서 메서드를 추출하면 Eclipse는 추출 된 메서드를 수정 된 메서드 위에 놓습니다. 그러나 이것은 높은 수준의 세부 사항보다 낮은 수준의 세부 사항을 배치합니다. 밥 삼촌에 따르면, 나는 내 코드가 신문의 헤드 라인처럼 읽히도록 반대로해야한다. Java를 프로그래밍 할 때 저는 그의 조언을 따릅니다.

Python의 모범 사례는 무엇입니까?


8
모범 사례가 없습니다. 가장 의미있는 일을하십시오. 중요한 것은 상단에있는 것이 좋은 생각이며 일관성은 일반적으로 좋은 것입니다. PEP-8은 이것을 언급하지 않습니다. 그리고 그것이 돌에 놓인다면 그것이있을 것입니다.
Gareth Latty 2012

4
그리고 PEP8조차도 항상 결정적인 것은 아닙니다.
Ignacio Vazquez-Abrams

1
나는 보통 기능 (수, 세트 등)에 그룹에 의해 그것을 할
CppLearner

메서드 함수의 순서는 임의적 일 수 있습니다. 클래스 선언은 메서드 함수를 호출 하지 않고 정의 하기 때문 입니다. 이를 통해 클래스 메서드 루틴의 소스 코드는 나중에 목록에서 정의 될 메서드 함수를 성공적으로 사용할 수 있습니다.
DragonLord

답변:


67

다른 사람들이 지적했듯이 방법을 주문하는 올바른 방법이 없습니다. PEP 제안이 유용 할 수도 있지만 어쨌든. 가능한 한 객관적으로 귀하의 질문에 접근하도록 노력하겠습니다.

  • 인터페이스 우선 : 공용 메서드와 Python 매직 함수는 클래스의 인터페이스를 정의합니다. 대부분의 경우 귀하와 다른 개발자는 클래스를 변경하기보다 사용하기를 원합니다. 따라서 그들은 그 클래스의 인터페이스에 관심을 가질 것입니다. 소스 코드에서 첫 번째로 넣으면 신경 쓰지 않는 구현 세부 정보를 스크롤하지 않아도됩니다.

  • 속성, 매직 메서드 , 퍼블릭 메서드 : 클래스 인터페이스의 일부인이 세 가지 사이의 최상의 순서를 정의하는 것은 어렵습니다. @EthanFurman이 말했듯이 전체 프로젝트에 대해 하나의 시스템을 고수하는 것이 가장 중요합니다. 일반적으로 사람들 __init__()은 수업에서 가장 좋은 첫 번째 기능을 기대 하므로 바로 아래의 다른 마법 방법을 따릅니다.

  • 읽기 순서 : 기본적으로 이야기를 전달하는 방법에는 상향식 또는 하향식의 두 가지가 있습니다. 높은 수준의 함수를 먼저 배치하면 개발자는 처음 몇 줄을 읽음으로써 클래스를 대략적으로 이해할 수 있습니다. 그렇지 않으면 클래스를 이해하기 위해 전체 클래스를 읽어야하며 대부분의 개발자는 그럴 시간이 없습니다. 경험상, 본문에서 호출되는 모든 메서드 위에 메서드를 배치하십시오.

  • 클래스 메서드 및 정적 메서드 : 일반적으로 이것은 위에서 설명한 읽기 순서에 의해 암시됩니다 . 일반 메서드는 모든 메서드를 번 호출 할 수 있으므로 먼저 올 수 있습니다. 클래스 메서드는 클래스 메서드와 정적 메서드 만 호출 할 수 있으며 다음에 올 수 있습니다. 정적 메서드는 클래스의 다른 메서드를 호출 할 수 없으며 마지막에 올 수 있습니다.

도움이 되었기를 바랍니다. 그런데 이러한 규칙의 대부분은 Python에만 국한되지 않습니다. 메소드 순서를 강제하는 언어는 잘 모르겠지만 만약 그렇다면 꽤 흥미로울 것이므로 코멘트 부탁드립니다.


1
일반적으로 언어는 순서를 강요하지 않습니다. 그러나 일부 언어에는 공통된 규칙이 있습니다. 예를 들어 C # StyleCop 에는 엄격한 순서 규칙이 있습니다. Java의 경우 stackoverflow.com/questions/4668218 등을 참조하십시오 .
xmedeko 2017 년

1
클래스 메서드 : 이들은 종종 생성자로 사용되며 일반적으로 __init__명시 적으로 (와 조합하여 __new__) 또는 암시 적으로 (기본 생성자를 통해) 호출 하므로 __init__. ( 전에 배치 된 것을 본 적이 없지만 __init__.)
oulenz

15

올바른 주문이 없습니다. 시스템을 선택하고 고수하십시오. 내가 사용하는 것은 :

class SomeClass(object):
    def __magic_methods__(self):
        "magic methods first, usually in alphabetical order"
    def _private_method(self):
        "worker methods next, also in alpha order"
    def a_method(self):
        "then normal methods, also in alpha order"

2
staticmethod, 클래스 변수 및 @property 데코 레이팅 된 메소드에 대한 선호도는 무엇입니까?
존 미는

@JohnMee : 다른 것보다 먼저 넣은 클래스 변수; 내 접는 방법을 숨 깁니다 @staticmethod, @classmethod, @property, 및 기타 @decorator선 나는 그것이 (속성 사이에 이동하는 경향이 점을 제외하고 이동 위치를 결정하는 방법의 유형을 사용할 수 있도록 _private_methods하고 normal_methods).
Ethan Furman

따라서 순서가 기본적으로 매우 사적인 "마법"방법에서 사적인 방법으로 이동하면 @classmethods가 다음 ( @classmethod def a_class_method(cls)) 다음에 @staticmethods ( @staticmethod def a_static_method()) 가된다는 의미 입니까? 적어도 그게 내가 ... 그것을 이해 정책의 (내가하지 그런 않기 때문에 아무것도 접이식 내 IDE없이)
Kawu

2

Django의 소스에서 본 @Ethan과 비슷한 작업을 수행합니다. 여기서 주요 차이점은 영역을 구분하는 블록 주석입니다. "############" 예를 들면

class SomeClass(object):
    #################
    # Magic Methods #
    #################
    def __magic_methods__(self):
        "magic methods first"

    ##################
    # Public Methods #
    ##################
    def a_method(self):
        "then normal methods, in order of importance"

    ###################
    # Private Methods #
    ###################
    def _private_method(self):
        "then worker methods, grouped by importance or related function"

분명히 이것은 소규모 클래스에는 덜 유용합니다.


19
그러나 나는 그들이 마술, 공개 또는 비공개라는 것을 알 수 있습니다. 나는 그러한 코멘트 블록을 적극적으로 싫어한다. 모든 목록을 보려면 접힌 코드를 볼 수 있습니다. 기능 관련 메서드의 특정 블록 위에 주석을 추가하는 것은 제가 할 수있는 일이지만, 이러한 유형의 주석에 대해서는 메서드 이름이 알려주는 것입니다.
Chris Morgan

다시 말하지만, 나는 더 큰 수업에 대해서만 이것을합니다. 매직 메서드를 세미 프라이빗 ( ) 및 이름 얽힌 (_ ) 메서드 와 혼동하기 쉽습니다 .
Matt Luongo

나는 ####당신이 의도적으로 거기 놓았다는 것을 깨달았을 때 추악한 블록을 제거하는 중간 편집 중이었습니다 ! 내가 수행에 동의 하기 위해 이 질문에 대해 무엇이다,하지만. ####질문의 범위와 관련이 없으며 귀하의 예제는 ####어쨌든 사용하지 않을 소규모 클래스이므로이 예제에서를 제거하는 것이 좋습니다 . :-)
Mateen Ulhaq

1
@MateenUlhaq 편집 화면에 표시되는 두 번째 및 다섯 번째 지침을 참조하십시오 : "변경하지 않고 의미를 명확히 함"및 " 항상 원저자를 존중하십시오". (이들은 편집자 자신의 의견과 상관없이 무조건적으로 적용된다는 점에 유의하십시오.)이 답변의 전체이자 유일한 요점은 추악한 주석 블록을 표시하는 것입니다. 그들 없이는 Ethan의 대답과 똑같은 것을 말하고 여기에있을 이유가 없습니다. 당신은 심지어 블록이 " 의도적으로 " 거기에 있었다는 것을 인정했습니다. 이것을 알면서, 왜 가서 그것들을 제거하겠습니까?
안녕하세요.

1
@MIWright 나는 그것을 질문의 범위 밖에 있다고 생각했습니다. 보시다시피 rev2 에는 Ethan과는 다른 순서 (및 하위 순서!)로 질문에 대한 답변이 다른 자료가 여전히 포함되어 있습니다. 그럼에도 불구하고 롤백되었습니다.
Mateen Ulhaq
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.