새로운 pycharm 릴리스 (3.1.3 커뮤니티 에디션)에서는 현재 객체의 상태에서 작동하지 않는 메소드를 정적으로 변환 할 것을 제안합니다.
그 이유는 무엇입니까? 어떤 종류의 마이크로 성능 (또는 메모리) 최적화?
답변
PyCharm 은 정적 메소드를 갖고 싶었지만 ” @staticmethod
데코레이터를 사용하여”정적으로 선언하는 것을 잊어 버렸다고 생각합니다 .
PyCharm은 메소드가 본문에서 사용 self
되지 않으므로 실제로 클래스 인스턴스를 변경 하지 않기 때문에이를 제안 합니다 . 따라서 메소드는 정적 일 수 있습니다. 즉, 클래스 인스턴스를 전달하지 않거나 클래스 인스턴스를 만들지 않고도 호출 할 수 있습니다.
답변
@jolvi, @ArundasR 및 기타와 함께 경고를 사용하지 않는 멤버 함수에서 경고가 발생합니다 self
.
PyCharm이 잘못되었다고 확신하는 경우, 함수가해서는 안되며 @staticmethod
경고가 0이 아닌 경우 두 가지 방법으로 벗어날 수 있습니다.
해결 방법 # 1
def bar(self):
self.is_not_used()
doing_something_without_self()
def is_not_used(self):
pass
해결 방법 # 2 [감사합니다 @ DavidPärsson ]
# noinspection PyMethodMayBeStatic
def bar(self):
doing_something_without_self()
내가 가지고있는 응용 프로그램 (@staticmethod를 사용할 수없는 이유)은 프로토콜 하위 유형 필드에 응답하기위한 핸들러 함수 테이블을 만드는 것이 었습니다. 모든 핸들러는 동일한 형태의 코스 여야합니다 (정적 또는 비 정적). 그러나 일부는 인스턴스와 관련이 없습니다. 그 정적을 만들면 “TypeError : ‘staticmethod’개체를 호출 할 수 없습니다”라는 메시지가 나타납니다.
OP의 consternation을 지원하여 가능한 한 정적 메소드를 추가 할 것을 제안하며 원칙에 위배됩니다. 정적 메소드를 추가 할 것을 제안하고 나중에 코드를 더 제한적으로 만드는 것이 더 쉬운 것보다 더 쉽다 instance.f () 대신 class.f ()를 호출하십시오.
이 경고가 존재하는 이유를 추측합니다.
- 그것은 StaticMethod를 알립니다 . 개발자가 의도 한 것을 인식하게합니다.
- @JohnWorrall의 지적대로, 실수로 자신이 빠져 나갔을 때주의를 기울입니다. 기능에서 입니다.
- 그것은 객체 모델을 다시 생각하게하는 신호입니다. 함수 가이 클래스에 전혀 속하지 않을 수도 있습니다.
답변
이 경고의 이유는 Pycharm의 구성이라고 생각합니다. Editor-> Inspection에서 선택 사항 이 정적 일 수 있음을 선택 취소 할 수 있습니다.
답변
나는 여기에 주어진 대답에 동의합니다 (방법은 사용하지 않으므로 self
장식 할 수 있습니다 @staticmethod
).
클래스 내 정적 메서드 대신 최상위 함수로 메서드를 이동하고 싶을 수도 있습니다. 자세한 내용은이 질문과 허용되는 답변을 참조하십시오 : python-정적 메소드 또는 최상위 함수를 사용해야합니까
메서드를 최상위 함수로 옮기면 PyCharm 경고도 수정됩니다.
답변
클래스 메소드를 정적 메소드로 정의하면 다음과 같은 장점이 있습니다.
- 클래스 이름을 사용하여 메소드를 호출 할 수 있으며 인스턴스화 할 필요가 없습니다.
남아있는 장점은 아마도 존재하지 않을 것입니다 :
- 조금 더 빨리 달릴지도 모른다
- 약간의 메모리를 절약
답변
당신이 언급하지 않았기 때문에 self
에서 bar
메소드 본문이 경우, PyCharm는 요구하고 있습니다 확인하고 싶었습니다 bar
정적. Java와 같은 다른 프로그래밍 언어에서는 정적 메소드를 선언해야하는 분명한 이유가 있습니다. 파이썬에서 정적 메소드 (AFIK)의 유일한 장점은 클래스의 인스턴스없이 호출 할 수 있다는 것입니다. 그러나 이것이 유일한 이유라면 최상위 기능을 사용하는 것이 좋습니다 . .
요컨대, 나는 그것이 왜 거기 있는지 백퍼센트 확실하지 않습니다. 나는 그들이 곧 릴리스에서 그것을 제거 할 것이라고 추측하고있다.
답변
이 오류 메시지는 테스트 예제 플레이어를 사용하여 실수로 함수를 작성했음을 깨닫지 못했기 때문에 많은 도움이되었습니다.
my_player.attributes[item]
올바른 방법 대신
self.attributes[item]