답변:
PyCharm 은 정적 메소드를 갖고 싶었지만 " @staticmethod
데코레이터를 사용하여"정적으로 선언하는 것을 잊어 버렸다고 생각합니다 .
PyCharm은 메소드가 본문에서 사용 self
되지 않으므로 실제로 클래스 인스턴스를 변경 하지 않기 때문에이를 제안 합니다 . 따라서 메소드는 정적 일 수 있습니다. 즉, 클래스 인스턴스를 전달하지 않거나 클래스 인스턴스를 만들지 않고도 호출 할 수 있습니다.
NotImplementedError
.
self
있습니다. 이 경우 경고는 무시할 수 있으며로 표시합니다 # noinspection PyMethodMayBeStatic
. IntelliJ IDEA가이 경고에 대한 상황에 맞는 메뉴에이 비활성화 주석을 추가하는 기능을 제공하지 않는 것은 안타깝습니다.
@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 ()를 호출하십시오.
이 경고가 존재하는 이유를 추측합니다.
# noinspection PyMethodMayBeStatic
메소드 또는 클래스 위에 추가 하면 경고가 표시되지 않으며 빈 메소드를 호출하는 것보다 낫습니다.
self
는 Python3에서 전혀 제거되지 않습니다.
이 경고의 이유는 Pycharm의 구성이라고 생각합니다. Editor-> Inspection에서 선택 사항 이 정적 일 수 있음을 선택 취소 할 수 있습니다.
나는 여기에 주어진 대답에 동의합니다 (방법은 사용하지 않으므로 self
장식 할 수 있습니다 @staticmethod
).
클래스 내 정적 메서드 대신 최상위 함수로 메서드를 이동하고 싶을 수도 있습니다. 자세한 내용은이 질문과 허용되는 답변을 참조하십시오 : python-정적 메소드 또는 최상위 함수를 사용해야합니까
메서드를 최상위 함수로 옮기면 PyCharm 경고도 수정됩니다.
self
매개 변수가 아닌 경우 정적 메소드가 아닌 최상위 함수를 작성합니다 .
self
최상위 클래스가있는 클래스가 있지만이 메소드가 수행하는 작업을 볼 때 논리적으로 느껴지지 않습니다. 실제로 해당 클래스에서 생성 된 인스턴스에 대한 작은 도우미 메서드입니다. 따라서 코드를 논리적으로 구성하려면 데코레이터가 완벽한 솔루션입니다.
클래스 메소드를 정적 메소드로 정의하면 다음과 같은 장점이 있습니다.
남아있는 장점은 아마도 존재하지 않을 것입니다 :
bit
더 빨리 실행하는 것이 중요 하지 않습니다 (두 경우 모두 램에서 빠르게 실행되기 때문에). 이제 컴퓨터에는 bunch
메모리가 있으므로 더 이상 문제가되지 않습니다. 또한 첫 번째 생각에 주목하십시오 : 그것은 객체 지향적 인 것이 아닌 절차 적 행동입니다.
당신이 언급하지 않았기 때문에 self
에서 bar
메소드 본문이 경우, PyCharm는 요구하고 있습니다 확인하고 싶었습니다 bar
정적. Java와 같은 다른 프로그래밍 언어에서는 정적 메소드를 선언해야하는 분명한 이유가 있습니다. 파이썬에서 정적 메소드 (AFIK)의 유일한 장점은 클래스의 인스턴스없이 호출 할 수 있다는 것입니다. 그러나 이것이 유일한 이유라면 최상위 기능을 사용하는 것이 좋습니다 . .
요컨대, 나는 그것이 왜 거기 있는지 백퍼센트 확실하지 않습니다. 나는 그들이 곧 릴리스에서 그것을 제거 할 것이라고 추측하고있다.
약간 지저분 할 수도 있지만 때로는 액세스 할 필요는 self
없지만 메소드를 클래스에 유지하고 싶지는 않습니다. 정적 것이 좋습니다. 또는보기 흉한 데코레이터를 추가하지 않으려 고합니다. 해당 상황에 대한 몇 가지 잠재적 해결 방법이 있습니다.
메소드에 부작용 만 있고 리턴되는 것에 신경 쓰지 않는 경우 :
def bar(self):
doing_something_without_self()
return self
반환 값이 필요한 경우 :
def bar(self):
result = doing_something_without_self()
if self:
return result
이제 메소드가을 사용 self
하고 있으며 경고가 사라집니다!
파이썬이 none 정적 메소드를 호출 할 때 (@staticmethod를 추가하지 않음) 첫 번째 인수로 self를 전달하기 때문에 Pycharm이 경고로 경고하는 이유. Pycharm은 그것을 알고 있습니다.
예:
class T:
def test():
print "i am a normal method!"
t = T()
t.test()
output:
Traceback (most recent call last):
File "F:/Workspace/test_script/test.py", line 28, in <module>
T().test()
TypeError: test() takes no arguments (1 given)
나는 Java에서 왔으며 Java에서 "self"는 "this"라고 불리며 클래스 메소드에서 인수로 self (또는 this)를 쓸 필요가 없습니다. 메소드 내부에서 필요에 따라 self를 호출 할 수 있습니다. 그러나 파이썬은 "메소드"를 메서드 인수로 전달해야합니다.
이것을 이해하면 @BobStein 답변으로 해결 방법이 필요하지 않습니다.
self
무엇 때문에?
self
메소드 내부의 아무 곳이나 참조하십니까 ? (질문이 실제로 "PyCharm의 디자이너가 왜 이런 식으로 디자인 했는가? 그렇게 질문하지 말아야한다 ...")