2013-02-20 3 views
3

나는 내가하고 global function betweent의 차이 무엇 모르는 클래스의 인스턴스에 액세스 할 수 없습니다파이썬에서 @staticmethod와 전역 함수를 사용하는 차이점은 무엇입니까?

을 읽고?

언제 staticmethod을 사용해야합니까? 좋은 본보기를 줄 수 있습니까?

+3

내 opion에서 가장 좋은 대답은 첫 번째 링크에서 승인 된 답 가기 코멘트입니다 : "A StaticMethod를 쓸모없는 - 클래스에 함수를 넣는 방법입니다 (논리적으로 거기에 속하기 때문에). 클래스에 액세스 할 필요가 없음을 나타냅니다. " 특정 날짜와 관련된 것들을 정적 메서드를 갖는'datetime' 클래스를 이미징 할 수는 있지만, 그 함수는 모듈 레벨에서도 똑같이 잘 수행 될 수 있습니다. – Evert

답변

0

정적 메서드는 클래스에 포함되어 있습니다 (@MartijnPieters에서 지적한 네임 스페이스 추가). 전역 함수가 아닙니다.

+0

그렇지 않습니다. 클래스에 * 네임 스페이스를 추가하는 것만 포함됩니다. –

+0

@MartijnPieters : 다소 잘못 말한 것 .. 업데이트되었습니다. 그것이 클래스에 묶여있다는 나의 의도는 당신의 설명만큼 명확하지 않았다. (클래스에 바인드 된 클래스와 클래스의 인스턴스 **에 묶인 사이에 혼란이있을 수 있기 때문에, 나는 전혀 의미하지 않았다.). –

1

전역 함수와 마찬가지로 정적 메서드는 포함하는 클래스의 인스턴스에 액세스 할 수 없습니다. 그러나 그것은 개념적으로 포함하는 클래스에 속합니다. 다른 이점은 이름 충돌을 피할 수 있다는 것입니다.

함수가 특정 클래스에 대해 제공되도록 디자인 된 경우 해당 클래스의 정적 메서드로 사용하는 것이 좋습니다. 이를 cohesion이라고합니다. 게다가,이 함수가 외부에서 사용되지 않는다면, "private"으로 표시하기 위해 앞에 밑줄을 추가 할 수 있습니다. 파이썬이 실제로는 private 메소드를 지원하지는 않지만 information hiding이라고합니다. 일반적으로 인터페이스를 가능한 한 적게 노출 시키면 코드를보다 깨끗하게 만들 수 있고 변경하기가 줄어 듭니다.

이 함수가 여러 모듈에 걸쳐있는 많은 클래스의 공유 유틸리티로 사용된다고하더라도 전역 함수로 만드는 것은 여전히 ​​첫 번째 선택이 아닙니다. 유틸리티 클래스의 정적 메서드로 만들거나 일부 특수 모듈에서 전역 함수로 만들 것을 고려하십시오. 한 가지 이유는 비슷한 목적의 함수를 공통 클래스 또는 모듈로 모으는 것이 다른 레벨의 추상화/모듈화에 적합하다는 것입니다 (소규모 프로젝트의 경우 일부 사람들은 이것이 과장되어 있다고 주장 할 수도 있습니다). 다른 이유는 네임 스페이스 오염을 줄일 수 있기 때문입니다.

+1

"함수가 많은 클래스의 공유 유틸리티로 사용된다고하더라도 전역 함수로 사용하는 것은 권장하지 않습니다.": 그건 나에게 뉴스입니다. 예, 네임 스페이스가 좋은 점은 알고 있지만 추천 (내가 그것을 놓쳤을지도 모른다)? .. –

+0

@DemianBrecht 나는 나의 대답을 최신의 것으로 바꿨다. –

+0

"그 함수가 많은 클래스의 공유 유틸리티 역할을한다고해도 글로벌 함수로 만드는 것은 여전히 ​​권장하지 않습니다."=> 실제로는 그렇습니다. 가지고 있지 않을 때 일반 함수를 사용하는 것이 좋습니다 staticmethod에 갈 좋은 이유. wrt/namespaces, 모듈은 이미 네임 스페이스입니다. –

0

IMO 기술적 인 문제가 아니라 설계상의 문제입니다. 논리가 클래스가 아닌 (인스턴스가 아닌) 클래스에 속한다고 생각하면 staticmethod으로 추가하십시오. 관련이없는 경우에는 전역 함수로 구현하십시오. 예를 들어

는 :

class Image(object): 
    @staticmethod 
    def to_grayscale(pixel): 
     # ... 

IMO보다 나은

def to_grayscale(pixel): 
    #... 

class Image(object): 
    # ... 
관련 문제