https://wikidocs.net/16074


44. class 정리 - 정적메소드 @classmethod와 @staticmethod의 정리

1. 정적메소드(@classmethod와 @staticmethod)

  • 정적메소드라 함은 클래스에서 직접 접근할 수 있는 메소드입니다.
  • 파이썬에서는 클래스에서 직접 접근할 수 있는 메소드가 두가지가 있습니다.staticmethod와 classmethod 입니다.
  • 하지만 파이썬에서는 다른언어와는 다르게 정적메소드임에도 불구하고 인스턴스에서도 접근이 가능합니다. 이 차이에 유의해야합니다.
  • 에디터에서 static_method.py파일을 작성합니다.
  • 인스턴스 메소드는 첫번째 인자로 객체 자신 self자신을 입력합니다.
  • classmethod는 첫번째 인자로 클래스를 입력합니다.
  • staticmethod는 특별히 추가되는 인자가 없습니다.
class CustomClass:

    # instance method
    def add_instance_method(self, a,b):
        return a + b

    # classmethod
    @classmethod
    def add_class_method(cls, a, b):
        return a + b

    # staticmethod
    @staticmethod
    def add_static_method(a, b):
        return a + b
  • REPL을 통해 접근해봅니다.
  • 먼저 인스턴스 메소드를 클래스에서 바로 접근해봅니다.
  • 일반적으로 인스턴스 메소드안에서 인스턴스 변수를 접근할경우 아래처럼 사용하면 안되고, 첫번째 인자에 객체를 할당해야합니다.
>>> from static_method import CustomClass
>>> CustomClass.add_instance_method(None, 3, 5)
8
  • classmethod를 접근해봅니다.
  • 첫번째 인자가 클래스지만 생략하고 접근해야합니다.
>>> CustomClass.add_class_method(CustomClass, 3, 5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: add_class_method() takes 3 positional arguments but 4 were given
>>> CustomClass.add_class_method(3, 5)
8



  • classmethod의 흥미로운 점은, classmethod를 실행하는 class가 첫번째 인자인 cls로 인식된다는 점입니다.

    이를 확인해보기 ChildClass가 ParentClass를 상속하는 상황을 가정하고, 각기 다른 class에서 를 classmethod인 add_class_method를 호출해 보겠습니다. 

class ParentClass:
    @classmethod
    def add_class_method(cls, a, b):
        return cls

class ChildClass(ParentClass):
    pass
    >>> ChildClass.add_static_method(3, 5)
    <class '__main__.ChildClass'>
    
    >>> ParentClass.add_static_method(3, 5)
    <class '__main__.ParentClass'>
    



      • staticmethod를 접근해봅니다.
      >>> CustomClass.add_static_method(3, 5)
      8  
      
      • classmethod도 staticmethod도 객체에서 접근이 됩니다.유의해야합니다.
      >>> a = CustomClass()
      >>> a.add_class_method(3, 5)
      8
      >>> a.add_static_method(3, 5)
      8
      

      2. @classmethod와 @staticmethod 의 차이

      • classmethod와 static메소드의 차이는 상속에서 두드러지게 차이가 납니다.
      • 예제를 만들어봅니다. language.py를 작성합니다.
      class Language:
          default_language = "English"
      
          def __init__(self):
              self.show = '나의 언어는' + self.default_language
      
          @classmethod
          def class_my_language(cls):
              return cls()
      
          @staticmethod
          def static_my_language():
              return Language()
      
          def print_language(self):
              print(self.show)
      
      
      class KoreanLanguage(Language):
          default_language = "한국어"
      
      
      • REPL에서 결과값을 확인합니다.
      • staticmethod에서는 부모클래스의 클래스속성 값을 가져오지만, classmethod에서는 cls인자를 활용하여 cls의 클래스속성을 가져오는 것을 알 수 있습니다.
      >>> from language import *
      >>> a = KoreanLanguage.static_my_language()
      >>> b = KoreanLanguage.class_my_language()
      >>> a.print_language()
      나의 언어는English
      >>> b.print_language()
      나의 언어는한국어


      + Recent posts