정적 메서드-다른 메서드에서 메서드를 호출하는 방법은 무엇입니까?


95

클래스에서 다른 메서드를 호출하는 일반 메서드가있는 경우이 작업을 수행해야합니다.

class test:
    def __init__(self):
        pass
    def dosomething(self):
        print "do something"
        self.dosomethingelse()
    def dosomethingelse(self):
        print "do something else"

하지만 정적 메서드가 있으면 쓸 수 없습니다.

self.dosomethingelse()

인스턴스가 없기 때문입니다. 같은 클래스의 다른 정적 메서드에서 정적 메서드를 호출하려면 Python에서 어떻게해야합니까?

편집 : 엉망입니다. 네, 질문을 원래 질문으로 되돌 렸습니다. 저는 이미 Peter Hansen의 의견에있는 두 번째 질문에 대한 답을 가지고 있습니다. 내가 이미 가지고있는 답변에 대해 다른 질문을 열어야한다고 생각한다면 plz 말해주세요.


3
@pablo : 질문의 본질을 바꿀 수 없습니다! 이 질문을 끝내고 다른 질문을 시작하십시오 !!
jldupont 2009

그래 그래. 질문 삭제를 의미합니까? 대답은 이미 Peter Hansen의 의견에 있습니다
Pablo

@pablo : 질문에 대한 답변을 제공 한 모든 사람에게 정중하지 않은 항목을 삭제할 수는 없습니다. 당신은 대답을 동의해야 하고 새 질문을 만들 수 있습니다.
jldupont 2009

1
@pablo : 그리고 명확하게하기 위해 : 원래 질문 공식에 대한 답변을 받아 들여야합니다 . 걱정하지 마세요. 여기서 길을 배울 수 있습니다. 건배 :-)
jldupont 2009

답변:


77

class.method 작동해야합니다.

class SomeClass:
  @classmethod
  def some_class_method(cls):
    pass

  @staticmethod
  def some_static_method():
    pass

SomeClass.some_class_method()
SomeClass.some_static_method()

16
여기에 조언을 추가해야합니다. classmethods는 staticmethod에 대한 결점이 없으며, classmethods를 사용하면 나중에 다른 클래스 메소드를 호출하도록 메소드를 확장 할 수 있습니다. 따라서 즉각적인 필요가 없더라도 항상 선호되어야합니다.
u0b34a0f6ae 2009

1
@ u0b34a0f6ae : 내가 좋은 일을하고 있는지 아닌지는 모르겠지만 ... 클래스 내부에 데코레이터를 정의했습니다. 데코레이터는 "classmethod"가 아니라 "staticmethod"여야했습니다.
André Caldas 2013 년

@ u0b34a0f6ae 클래스 메소드는 항상 스레드 안전합니까? 내 사용 사례에서는 스레드로부터 안전하지 않을 수있는 클래스에 대한 우발적 인 액세스를 방지하기 위해 스레드에서 staticmethods를 사용하고 있습니다.
aquavitae 2014 년

@ u0b34a0f6ae는 항상 조금 강합니다. 예를 들어 PySpark staticmethods를 사용하면 rdd 작업에서 사용할 수 있지만 classmethod는 사용할 수 없습니다.
Laurens Koppenol

134

같은 클래스의 다른 정적 메서드에서 정적 메서드를 호출하려면 Python에서 어떻게해야합니까?

class Test() :
    @staticmethod
    def static_method_to_call()
        pass

    @staticmethod
    def another_static_method() :
        Test.static_method_to_call()

    @classmethod
    def another_class_method(cls) :
        cls.static_method_to_call()

호출 Test.static_method_to_call()은이 클래스의 다른 비 정적 및 비 클래스 메서드에서도 작동해야합니다. 그렇죠? (... 그리고 아마 다른 수업도?)
gr4nt3d

예, Test.static_method_to_call()어디서나 작동합니다.
warvariuc

11

참고-질문이 일부 변경된 것 같습니다. 정적 메서드에서 인스턴스 메서드를 호출하는 방법에 대한 대답은 인스턴스를 인수로 전달하거나 해당 인스턴스를 정적 ​​메서드 내에서 인스턴스화하지 않고서는 불가능하다는 것입니다.

다음은 대부분 "다른 정적 메서드에서 정적 메서드를 호출하는 방법"에 대한 답변입니다.

마음에 곰이 있다는 것입니다 파이썬에서 정적 메소드와 클래스 메소드의 차이. 정적 메서드는 암시 적 첫 번째 인수를 사용하지 않는 반면 클래스 메서드는 클래스를 암시 적 첫 번째 인수로 사용합니다 (보통cls 으로 규칙에 따라). 이를 염두에두고이를 수행하는 방법은 다음과 같습니다.

정적 메서드 인 경우 :

test.dosomethingelse()

클래스 메서드 인 경우 :

cls.dosomethingelse()

1
cls.dosomethingelse()클래스 정의 내 에서만 사용할 수 있습니다 .
jldupont 2009

3
더 정확하게 말하면 cls.dosomethingelse()클래스 메서드 자체 내 에서만 사용할 수 있습니다 . self인스턴스 메서드 자체 에서만 사용할 수있는 것과 같습니다 .
Jason Baker

1
죄송합니다. 질문을 잘못 썼습니다. 죄송합니다!. "동일한 클래스의 다른 정적 메서드에서 인스턴스 메서드를 호출하려면 Python에서 어떻게해야합니까?"라고 작성하고 "같은 클래스의 다른 정적 메서드에서 정적 메서드를 호출하려면 Python에서 어떻게해야합니까?"라고 작성하고 싶었습니다. class "
Pablo

@pablo :이 경우에는 다른 질문 을 작성 하고이 질문을 완료 해야합니다 .
jldupont 2009

@jldupont, 이미 답변이 있지만 하나의 의견에 있습니다. 받아 들일 수 없어서 어떻게해야하는데 질문을 지우는 것은 아깝지 않습니까?
Pablo

4

좋습니다. 클래스 메서드와 정적 메서드의 주요 차이점은 다음과 같습니다.

  • 클래스 메서드는 고유 한 ID를 가지고 있으므로 INSTANCE 내에서 호출해야합니다.
  • 반면에 정적 메서드는 여러 인스턴스간에 공유 될 수 있으므로 THE CLASS 내에서 호출해야합니다.

0

정적 메서드에서 비 정적 메서드를 호출 할 수는 없지만 정적 메서드 내부에 인스턴스를 생성하면됩니다.

class test2(object):
    def __init__(self):
        pass

    @staticmethod
    def dosomething():
        print "do something"
        #creating an instance to be able to call dosomethingelse(),or you may use any existing instace
        a=test2()
        a.dosomethingelse()

    def dosomethingelse(self):
        print "do something else"

test2.dosomething()

도움이 되길 바랍니다 :)


3
IMO이 방법은 사용하는 것보다 특히 더 나쁜 @classmethod당신의 방법을 선언하고, 사용하여 cls.dosomethingelse()cls.dosomething()- 그것은 간단하지 (그리고 가독성 (단지 정적 메서드에 액세스하려면 개체를 인스턴스화) 모두 성능면에서 더, 나는 그런 종류가있는 경우 상상 패턴은 보일러되었다의 단순한 인간이 구문 분석에 대한 전체 코드베이스)는 매우 어려워 질 수있다
카일 와일드

내가 다른 곳에서 읽었 듯이 인스턴스를 직접 초기화하여 메서드를 호출하는 대신 호출 할 수 있습니다. 자체적으로 초기화됩니다.
Nakilon

0

이것들이 클래스 나 인스턴스에 의존하지 않는다면 왜 그냥 함수로 만들지 않습니까? 이것이 명백한 해결책처럼 보일 것입니다. 물론 덮어 쓸 필요가 있다고 생각하지 않는 한, 하위 클래스 등. 그렇다면 이전 답변이 최선의 선택입니다. 나는 누군가의 필요에 맞을 수도 있고 그렇지 않을 수도있는 대체 솔루션을 제공하기 위해 점수를 매기 지 않을 것이다.).

정답은 해당 코드의 사용 사례에 따라 달라 지므로;) 즐기십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.