>

객체 데이터에서 작동하지 않는 보조 기능을 포함하는 클래스가 있습니다. 일반적으로 나는이 메소드를 비공개로 두려고하지만 Python에 있으므로 그런 것이 없습니다. 테스트 에서이 메소드를 호출 할 수 있도록 클래스의 인스턴스를 인스턴스화 해야하는 것은 약간 바보 같은 것으로 나타났습니다. 이러한 방법을 정적으로 유지하거나 정적으로 선택해야하는 확실한 이론적 이유가 있습니까?


  • 답변 # 1

    구조적인 이유로 클래스에서 상기 메소드를 유지하려면 @staticmethod 를 사용하여 정적 메소드를 만들 수도 있습니다.  데코레이터 :

    class Foo():
        @staticmethod
        def my_static_method(*args, **kwargs):
             ....
    
    
    첫 번째 인수는 객체 자체로 해석되지 않으며 클래스 또는 해당 클래스의 객체에서 사용할 수 있습니다. 그래도 메소드에서 클래스 속성에 액세스해야하는 경우 클래스 메소드로 만들 수 있습니다.

    class Bar():
        counter = 0
        @classmethod
        def my_class_method(cls, *args, **kwargs):
            cls.counter += 1
            ...
    
    

    클래스 메소드의 첫 번째 인수는 분명히 인스턴스 대신 클래스가 될 것입니다.

    클래스 나 인스턴스 속성을 사용하지 않으면 정적이 아닌 "이론적"이유를 알 수 없습니다. 일부 IDE는 클래스/인스턴스 속성을 사용하지 않거나 변경하지 않는 경우 메소드를 정적으로 만들라는 소프트 경고로 강조 표시합니다.

  • 답변 # 2

    메소드가 현재 인스턴스에 액세스 할 필요가없는 경우, 클래스 메소드, 정적 메소드 또는 일반 함수로 만들 수 있습니다.

    클래스 메소드는 현재 클래스를 첫 번째 매개 변수로 가져옵니다. 이를 통해다른 클래스 메소드 또는 정적 메소드를 포함한 클래스 속성에 액세스 할 수 있습니다. 메소드가 다른 클래스 메소드 또는 정적 메소드를 호출해야하는 경우 올바른 선택입니다.

    정적 메소드는 명시 적 인수만을 얻습니다. 실제로 클래스 나 인스턴스에서 확인할 수있는 함수일뿐입니다. staticmethods의 주요 요점은 전문화입니다. 하위 클래스에서 staticmethod를 재정의하고 기본 클래스의 메소드 (classmethod 또는 instancemethod)를 사용하여 재정의 된 버전의 staticmethod를 호출 할 수 있습니다. 클래스와 별도로 함수를 가져옵니다 (이 시점에서 게으름에 접해 있지만 동적 가져 오기 등이 편리한 경우가 몇 가지 있습니다)

    일반 함수는 클래스 기반 디스패치, 상속, 멋진 것들이 아닌 일반 함수입니다. 그러나 동일한 모듈의 몇 클래스가 내부적으로 사용하는 클래스이고 모듈이나 모듈 API의 일부가 아닌 도우미 함수 인 경우 원하는 것일 수 있습니다.

    마지막 메모 : 파이썬에서 "일종의"프라이버시를 가질 수 있습니다. 대부분 밑줄로 하나의 이름 (속성/메소드/클래스 또는 일반 함수)을 접두어로 붙이는 것은 "이것은 구현 세부 사항이며, API의 일부가 아니며, 존재 여부를 알 필요도 없습니다. 예고없이 변경되거나 사라질 수 있으므로 코드를 사용하지 않으면 문제가됩니다. "

관련 자료

  • 이전 javascript - 왜 React 아코디언 애니메이션이 작동하지 않습니까?
  • 다음 javascript - 선택한 요소의 마지막 자식 대신 스타일 집합 중 마지막 자식에 스타일이 추가됨