>  Q&A  >  본문

python @property @staticmethod

这两个东西在什么情况下用

PHP中文网PHP中文网2741일 전783

모든 응답(1)나는 대답할 것이다

  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:06:34

    간단히 말하면

    • @property은 Python에서 getter/setter를 대체하는 데 사용되는 데코레이터로, 클래스 속성을 패키징, 처리 및 캡슐화할 수 있으며 읽기 전용 속성을 쉽게 생성할 수도 있다는 점이 핵심입니다. 인터페이스는 간단합니다. get_XXXset_XXX과 같은 지루한 getter/setter를 사용하지 않고도 직관적으로 속성에 액세스할 수 있기 때문입니다. 원래는 완전한 설명을 쓰고 싶었지만, 생각해보니 내용이 부족하다는 생각이 들어서 포기하고 앞으로는 이 분야를 잘 아시는 전문가분들이 계시다면 꼭 느껴보시기 바랍니다. 질문자와 나에게 몇 가지 의견을 자유롭게 주십시오.

    • @staticmethod 불필요한 데코레이터는 실용성이 없습니다라고 생각합니다. 🎜>


    (이 답변은 조금 더 어렵습니다. 중국어 번체를 읽기 어려우시면 브라우저를 이용하여 중국어 간체로 변환하여 읽으시면 됩니다...)

    @staticmethod

    기능 및 사용 시나리오

    먼저 얘기해보자

    음, staticmethod로 수정한 메서드는 특별한 첫 번째 인수를 받지 않습니다. (일반 인스턴스 메서드와 staticmethod로 수정한 classmethodcategory 메서드는 각각 인스턴스를 허용합니다. 클래스 참조를 첫 번째 매개변수로 사용), 이는 모듈 수준에서 직접 정의되지 않고 클래스에서 정의된다는 점을 제외하면 정적 메서드를 일반 함수처럼 만듭니다.

    따라서 그의

    사용 시나리오 는 다음과 같습니다. 클래스의 함수에 또는 self와 같은 인스턴스나 클래스에 대한 참조가 필요하지 않은 경우 정적 메서드를 사용하는 것이 더 간결할 수 있으며 작업을 얻을 수 있습니다. 효율적으로 이루어졌습니다. cls

    1. 간결한 부분은 중요하지 않은 추가 인수를 받을 필요가 없다는 것입니다

    2. 일반 인스턴스 메소드는 바인딩된 메소드(객체)이므로 사용하려고 할 때 생성된다는 점에서 비용이 조금 더 들지만 정적 메소드는 그렇지 않습니다.

    실용적인가요/실용적이지 않나요?

    하지만 우선 클래스와 직접적으로 관련된 함수에

    를 사용할 수는 있지만, 코드에서는 첫 번째 인수에서 제공하는 클래스 참조에 의존하여 클래스를 완성합니다. 관련 작업(예: classmethod을 대체하거나 더 많은 하위 하위 __init__을 파견하기 위한 상위 수준 방법). staticmethod

    클래스와 관련이 없고(인스턴스와 아무 관련이 없으면) 범주 정적 메서드의 목적이 필요합니다. 현재로서는 한 가지만 생각할 수 있습니다. 즉, 클래스에 추상 수준을 갖는 것입니다. call (예,

    namespace를 말하는 것입니다.) 이 함수는 클래스에 직접 접속하지는 않지만 클래스와 관련이 있습니다.

    하지만 Python에서는

    을 사용하는 것이 매우 쉽습니다. 원래 정의하고 싶었던 함수를 모듈 수준에서 정적 메서드로 정의하고 가능한 한 관련 카테고리에 가깝게 배치할 수도 있습니다. 아주 충분하다고 생각합니다(루치아노 라말류의 의견). namespace

    반성

    위 문단의 입력을 마친 직후 Julien Danjou의 훌륭한 기사를 읽었습니다.
    Python에서 정적, 클래스 또는 추상 메소드를 사용하는 방법에 대한 최종 가이드
    I 이 기사는 누구에게나 적극 권장됩니다. Python 메소드를 알고 싶은 사람.

    이 기사에서는 staticmethod의 두 가지 장점을 제시합니다. 위에서 언급한 첫 번째 요점은 정적 메서드가 인스턴스 메서드보다 더 간결하고 효율적이라는 것입니다. 두 번째 점은 정적 메서드 는 클래스와 아무런 관련이 없지만 클래스에 속하므로 클래스에 대한 서비스를 맞춤화할 수 있다는 의미입니다. 이것은 약간 이해하기 어렵습니다. 예를 살펴보겠습니다(Julien Danjou의 기사에 있는 예):

    으아악

    모듈 수준에서 mix_ingredients을 정의하면 Pizza을 상속하는 하위 클래스를 처리할 때 mix_ingredients를 변경하여 혼합 재료의 동작을 변경할 수 없다고 상상해 보겠습니다. 다른 클래스에서 사용되는 경우) cook을 재정의해야 합니다.

    이 때문에 마음이 조금 바뀌었습니다. 적어도 그는 정적 메서드와 일반 메서드의 가장 큰 차이점을 지적했습니다. 정적 메서드는 특정 범주에 속합니다.

    그러나 나는 여전히 원래 아이디어를 고수합니다. mix_ingredients가 더 잘 작성될 수도 있고, 피자와 같은 비추상적 범주의 경우 전혀 상속하지 말아야 하거나, 상속할 때 우선하는 방법이 그렇지 않기 때문입니다. 좋아. mix_ingredients을 바꾸는 것도 cook를 바꾸는 것만큼 부담스럽다고 느낄 수도 있다.

    요약

    위의 모든 내용 제 생각에는 , 아마도 언젠가 staticmethod가 제가 정말 우아하게 사용할 수 있게 해줄 거라고 생각합니다. 오늘은 제 무지와 피상적인 이해를 인정할 수도 있을 것 같습니다. 당신은 자신만의 생각을 가질 수 있다고 생각합니다. 충분히 알고 확신할 수 있다면 어떤 입장도 틀리지 않을 것 같습니다. :)


    내가 답변한 질문: Python-QA

    회신하다
    0
  • 취소회신하다