정적 메서드와 비슷하지만 약간의 차이점이 있는 클래스 메서드
클래스 메서드는 다음과 같이 메서드 위에 @classmethod 를 붙인다. 이때 클래스 메서드는 첫 번째 매개변수에 cls 를 지정해야 한다(cls : class)
class 클래스이름 :
@classmethod
def 메서드(cls, 매개변수1, 매개변수2 ... ) :
<< code >>
class Person :
count = 0 # 클래스 속성
# __init__ : 인스턴스가 만들어졌습니다 ~
def __init__(self):
Person.count += 1 # 인스턴스가 만들어질 때 클래스 속성 count 에 1을 더함.
@classmethod
def print_count(cls) :
print('{}명 생성되었습니다'.format(cls.count)) # cls 로 클래스 속성에 접근.
james = Person() # count + 1 = 1
maria = Person() # count + 1 = 2
Person.print_count() # 2명 생성되었습니다.
먼저 인스턴스가 만들어질 때마다 숫자를 세야 하므로 __init__ 메서드에서 클래스 속성 count 에 1을 더해줍니다. 물론 클래스 속성에 접근한다는 것을 명확하게 하기 위해 Person.count 와 같이 만들어줍니다.
class Person :
count = 0 # 클래스 속성
def __init__(self) :
Person.count += 1 # 인스턴스가 만들어질 때 클래스 속성 count 에 1을 더함
@classmethod 를 붙여서 클래스 메서드를 만듭니다. 클래스 메서드는 첫 번째 매개변수가 cls 인데 여기에는 현재 클래스가 들어옵니다. 따라서 cls.count 처럼 cls 로 클래스 속성 count 에 접근할 수 있다.
@classmethod
def print_count(cls) :
print('{0}명 생성되었습니다.'.format(cls.count)) # cls로 클래스 속성에 접근
클래스 메서드는 정적 메서드처럼 인스턴스 없이 호출할 수 있다는 점은 같습니다. 하지만 클래스 메서드는 메서드 안에서 클래스 속성, 클래스 메서드에 저븍ㄴ해야 할 때 사용합니다.
특히 cls 를 사용하면 메서드 안에서 현재 클래스의 인스턴스를 만들 수도 있습니다. 즉, cls 는 클래스이므로 cls() 는 Person() 과 같습니다.
@classmethod
def create(cls) :
p = cls() # cls 로 인스턴스 생성
retur p
# 연습문제 : 날짜 클래스 만들기
- 다음 소스 코드에서 Date 클래스를 완성하세요. is_date_valid는 문자열이 올바른 날짜인지 검사하는 메서드입니다. 날짜에서 월은 12월까지 일은 31일까지 있어야 합니다.
class Date :
@staticmethod
def is_date_valid(ate_string) :
year, month, day = map(int,date_string.split('-'))
return month <= 12 and day <= 31
if Date.is_date_valid("2000-10-31") :
print("올바른 날짜 형식입니다.")
else :
print("잘못된 날짜 형식입니다.")
반응형
'Programming > Python' 카테고리의 다른 글
[클래스] 상속 관계와 포함 관계 (1) | 2023.03.13 |
---|---|
[클래스] 상속 사용하기 (0) | 2023.03.13 |
[클래스] 정적메서드 사용하기 (0) | 2023.03.13 |
[클래스] 클래스 속성과 인스턴스 속성 알아보기 (0) | 2023.03.13 |
[클래스] 비공개 속성 사용하기 (0) | 2023.03.12 |