2012-06-06 2 views
8

가능한 중복 : Python Static methods, 이유가 무엇입니까?


What is the difference between @staticmethod and @classmethod in Python?

내가 클래스에서 staticmethods에 대한 몇 가지 질문이 있습니다. 나는 예제를 제시함으로써 시작할 것이다.

일례 :

class Static: 
    def __init__(self, first, last): 
     self.first = first 
     self.last = last 
     self.age = randint(0, 50) 
    def printName(self): 
     return self.first + self.last 
    @staticmethod 
    def printInfo(): 
     return "Hello %s, your age is %s" % (self.first + self.last, self.age) 

x = Static("Ephexeve", "M").printInfo() 

출력 :

Traceback (most recent call last): 
    File "/home/ephexeve/Workspace/Tests/classestest.py", line 90, in <module> 
    x = Static("Ephexeve", "M").printInfo() 
    File "/home/ephexeve/Workspace/Tests/classestest.py", line 88, in printInfo 
    return "Hello %s, your age is %s" % (self.first + self.last, self.age) 
NameError: global name 'self' is not defined 

예 2 :

class Static: 
    def __init__(self, first, last): 
     self.first = first 
     self.last = last 
     self.age = randint(0, 50) 
    def printName(self): 
     return self.first + self.last 
    @staticmethod 
    def printInfo(first, last, age = randint(0, 50)): 
     print "Hello %s, your age is %s" % (first + last, age) 
     return 

x = Static("Ephexeve", "M") 
x.printInfo("Ephexeve", " M") # Looks the same, but the function is different. 

출력

Hello Ephexeve M, your age is 18 

staticmethods에서 self.attribute를 호출 할 수 없다는 것을 알았습니다. 언제, 왜 사용해야하는지 잘 모르겠습니다. 내 생각에 몇 가지 속성을 가진 클래스를 만드는 경우 나중에 해당 속성을 사용하고 모든 속성을 호출 할 수없는 정적 메서드가 필요하지 않을 수 있습니다. 누구든지이 사실을 설명 할 수 있습니까? 파이썬이 저의 첫 프로그래밍 언어입니다. 예를 들어 이것이 자바에서 동일하다면, 저는 잘 모릅니다.

+0

투표 마감에 싫지만, 내가 링크 한 질문의 대답은 상당히 좋습니다. '@ classmethod'는 javas'static'과 비슷합니다. '@ staticmethod'는 꽤 쓸모가 없습니다. –

+0

감사합니다. Josh, 아마도 내가 제대로 검색하지 않았으므로 링크를 이용해 주셔서 감사합니다. –

답변

8

그걸로 무엇을 이루고자합니까? staticmethod? 그것이 무엇인지 모를 때 당신의 문제가 무엇이든 그것을 해결하기를 어떻게 기대합니까?

또는 당신은 단지 staticmethod이 무엇을보고 장난입니까? 이 경우 무작위로 적용하고 그것이하는 행동을 추측하려고 시도하는 것이 아니라 무엇이 수행되는지에 대해서는 아마도 생산성이 더 높을 것입니다. read the docs 클래스의 기능 정의에 @staticmethod인가 어쨌든

는 "정적 방법"을 만든다. "정적"은 유감스럽게도 프로그래밍에서 가장 혼란스럽게 오버로드 된 용어 중 하나입니다. 여기에서는 메서드 이 개체의 상태에 종속되거나 변경되지 않는다는 의미입니다.. 정적 메서드 foo이 클래스 Bar에 정의 된 경우 bar.foo(...) (여기서 bar은 클래스 Bar의 일부 인스턴스 임)을 호출하면 bar의 특성에 관계없이 똑같이 수행됩니다. 실제로 인스턴스가없는 경우에도 Bar.foo(...) 클래스에서 직접 호출 할 수 있습니다.

이것은 단순히 정적 방법으로 인스턴스를 전달하지 않음으로써 달성된다, 따라서 정적 메소드에는 self 매개 변수가있다.

정적 메서드는 거의 필요하지 않지만 때때로 편리합니다. 그것들은 실제로 클래스 외부에서 정의 된 단순 함수와 동일하지만, 클래스에 넣으면 클래스와 "연관"되어 있습니다. 일반적으로 클래스와 밀접한 관련이 있지만 실제로는 특정 객체에 대한 작업이 아닌 계산 또는 작업에 사용합니다.