icon_wait


    클래스 메서드와 정적 메서드

    클래스 메서드(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).

    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.