더북(TheBook)

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).

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