2017-04-16 13 views
1

저는 파이썬에서 어떤 클래스에 함수를 작성하고 있습니다. 사람들은이 함수에 장식자인 @classmethod을 추가하라고 제안했습니다.파이썬에서 classmethod를 사용해야하는 이유는 무엇입니까?

내 코드 :

import random 


class Randomize: 
    RANDOM_CHOICE = 'abcdefg' 

    def __init__(self, chars_num): 
     self.chars_num = chars_num 

    def _randomize(self, random_chars=3): 
     return ''.join(random.choice(self.RANDOM_CHOICE) 
         for _ in range(random_chars)) 

제안 된 변화 : 나는 거의 항상에만 _randomize 기능을 사용하고

@classmethod 
    def _randomize(cls, random_chars=3): 
     return ''.join(random.choice(cls.RANDOM_CHOICE) 
         for _ in range(random_chars)) 

.

제 질문은 : classmethod 데코레이터 기능을 추가하면 얻을 수있는 이점은 무엇입니까?

+5

이 메소드는 인스턴스의 어떤 상태도 사용하지 않는다는 것을 명확하게 해줍니다. 보통 'self'라고합니다. 또한 인스턴스를 만들지 않고 클래스에서 테스트 할 수 있음을 의미합니다. – jonrsharpe

+0

또한,이 클래스가 else를 많이 포함하지 않는다면 함수와'functools.partial()'을 사용하는 것이 더 나을 것입니다. 아마도. –

답변

2

_randomize 메소드가 표시되는 경우 init 변수에 선언 된 인스턴스 변수 (var) (예 : RANDOM_CHOICE = 'abcdefg')를 사용하고 있지 않습니다.

import random 

class Randomize: 
    RANDOM_CHOICE = 'abcdefg' 

    def __init__(self, chars_num): 
     self.chars_num = chars_num 

    def _randomize(self, random_chars=3): 
     return ''.join(random.choice(self.RANDOM_CHOICE) 
         for _ in range(random_chars)) 

즉, 메소드가 인스턴스 메소드가 아니어도 존재할 수 있으며 클래스에서 직접 호출 할 수 있습니다.

Randomize._randomize() 

지금은 어떤 이점이 있습니까?

  • 예, 오버 헤드가있는이 방법을 사용하기 위해 인스턴스를 만들 필요가 없습니다.

    ran = Randomize() // Extra steps 
    ran._randomize() 
    

당신은 here 변수 클래스 및 인스턴스에 대한 자세한 내용을보실 수 있습니다.