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

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

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

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



답변

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

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

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

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

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

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


답변

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

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"


답변

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"

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


답변