잠깐만요
클래스 메서드와 정적 메서드
클래스 메서드(class method)와 정적 메서드(static method)가 어떻게 다른지 예제를 보면서 설명하겠습니다.
코드 6-19 oop1/oop1_2/static_method.py ①
class A: @staticmethod def f(): #1 print('static method') @classmethod def g(cls): #2 print(cls.__name__) if __name__ = = "__main__": a = A() a.f() a.g()
실행결과 static method>
A
f( ) 함수는 정적 메서드입니다(#1). 정적 메서드는 인자로 클래스나 객체를 받지 않습니다. 함수의 정의만 클래스 A의 네임스페이스에 있을 뿐 일반 함수와 같으며 전역 함수를 대체하기에 가장 알맞습니다.
g( )는 클래스 메서드입니다(#2). 첫 번째 인자로 클래스 A를 받습니다. 두 메서드의 타입을 확인해 볼까요?
>>> type(A.f)
<class 'function'>
>>> type(A.g)
<class 'method'>
클래스 메서드는 대체 생성자로도 쓰입니다. 간단한 예제를 하나 보겠습니다.
코드 6-20 oop1/oop1_2/cls_method.py
class Person: def _ _init__(self, name, age): #1 self.name = name self.age = age @classmethod def init_from_string(cls, string): #2 ''' string format : '<name>_<age>' ''' name, age = string.split('_') return cls(name, int(age)) #3 if __name__ = = "__main__": p = Person.init_from_string('greg_30') #4 print(p.name) print(p.age)
실행결과 greg
30
def __init__(self, name, age):는 일반적인 생성자입니다(#1). 인자로 문자열 name과 숫자 age를 입력받습니다. 객체의 멤버 데이터가 문자열로 들어오고 그 형태가 <name>_<age>라면 클래스 메서드로 대체 생성자를 만들어 일반 생성자 대신 객체를 만들 수 있습니다. init_from_string( ) 메서드는 <name>_<age> 형태의 문자열을 인자로 받아(#2) 이를 분석하여 일반적인 생성자를 다시 호출합니다(#3). 이렇게 메서드를 설계해 두면 p = Person.init_from_string('greg_30')처럼 필요할 때마다 클래스 메서드를 호출해서 객체를 만들 수 있어 편리합니다(#4).