2009-03-28 4 views
26

Ex.classmethod를 인스턴스의 메서드로 호출하는 것은 나쁜 형식입니까?

나는 이런 식으로 뭔가가있는 경우 :

class C(object): 
    @classmethod 
    def f(cls, x): 
     return x + x 

이 작동합니다

c = C() 

c.f(2) 
4 

을하지만 나쁜 형태이다? 는 난 단지

C.f() 

또는 분명히

c.__class__.f() 

, 이것은 단지 /이 클래스가 될 것으로 기대 CLS f는 자기와 상호 작용하지 않는 경우에 의미를 가졌 호출해야합니다.

?

+1

OT를 할 "좋은 형태"의이 방법은 있지만, C .__ class__ – Miles

답변

25

인스턴스에서 클래스 메소드를 호출하려는 경우 클래스 메소드가 필요하지 않습니다.

예를 들어 정적 메서드를 사용하면 마지막 발언 (셀프/클레임 상호 작용 없음) 때문에 정확하게 더 적합합니다.

class C(object): 
    @staticmethod 
    def f(x): 
     return x + x 

이 모두

c = C() 
c.f(2) 

C.f(2) 
+0

예. 그렇다면 실제로 클래스 메서드가 필요합니까? – frnhr

4

주로 혼란 스럽습니다. 만약 내가 당신의 수업을 사용하고 이것을 보았다면 다른 놀라움이 무엇인지 궁금하게 생각할 것입니다. 단지 나쁜 디자인처럼 보입니다.

정적 메서드가 아닌 이유가 있습니까?

2

C.f()c_instance.f()보다 명확하고 c_instance.__class__.f()은보기 흉합니다. 선명도와 아름다움은 파이썬 커뮤니티에서 사랑받는 특성이기 때문에 C.f()가 가장 좋은 방법이라고 할 수 있습니다.

다른 방법으로도 전화하고 싶은 특별한 이유가 있습니까?

+4

클래스의 이름 (에 유형 (c)를 선호 이 경우 'C')는 변경 될 수 있습니다 ... –

3

이미 C 인스턴스가있는 경우 f()가 클래스 메소드가되어야하는 이유는 무엇입니까? 그것은 나쁜 형태 일뿐만 아니라 대개 불필요합니다. 그물에있는 누군가 말합니다 : "이것은 객체의 일부 인스턴스 변수가 사용되었다는 인상을주기 때문에 좋지 않지만 그렇지 않습니다." 484 당신이 방법에게 어느 쪽이든을 호출 할 수 있습니다 그것은 한 당신이 같은 인스턴스를 전달 정확히 동일합니다 노트 learning python의.

+4

주어진 예제 코드에 대해 classmethod-on-instance는 필요하지 않지만 C를 하위 클래스 화하기 시작한 경우 가능합니다. – bobince

9

나는이 같은 classmethod를 사용하여 기억하지 않습니다

페이지,하지만 클래스 외부에서 호출 할 수는 있지만 인스턴스 메서드가 자체적으로 클래스 메서드를 호출하는 것이 좋습니다 (예 : self.foo(), foo은 클래스 메서드 임). 이렇게하면 상속이 예상대로 작동하고 기본 클래스 대신 오른쪽 서브 클래스에 .foo()이 호출됩니다.

관련 문제