study/Python 🌼

[Python] classmethod vs staticmethod

서나쓰 2021. 5. 28. 11:22
728x90

정적메소드

  • 정적 메소드라 함은 클래스에서 직접 접근할 수 있는 메소드이다
  • 파이썬에서는 클래스에 직접 접근할 수 있는 메소드가 두 가지이다
  • 정적메소드임에도 불구하고 인스턴스에서도 접근이 가능하다
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
  1. 인스턴스 메소드를 클래스에서 바로 접근하기
     >>> from static_method import CustomClass
     >>> CustomClass.add_instance_method(None, 3, 5)
     8
  2. 일반적으로 인스턴스 메소드 안에서 인스턴스 변수를 접근할 경우 아래에처럼 사용하면 안되고, 첫번째 인자에 객체 할당
  3. 클래스메소드 접근
     >>> 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
  4. 첫번째 인자가 클래스지만 생략하고 접근
  5. 스태틱메소드로 접근
>>> CustomClass.add_static_method(3, 5)
8
  1. 클래스메소드도 스태틱메소드도 객체에서 접근 가능
>>> a = CustomClass()
>>> a.add_class_method(3, 5)
8
>>> a.add_static_method(3, 5)
8

차이점

  • 상속에서 두드러지게 나타난다
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 = "한국어"
  • staticmethod에서는 부모 클래스의 클래스 속성값을 가져오지만, classmethod에서는 cls의 클래스 속성을 가져온다.
>>> from language import *
>>> a = KoreanLanguage.static_my_language()
>>> b = KoreanLanguage.class_my_language()
>>> a.print_language()
나의 언어는English
>>> b.print_language()
나의 언어는한국어
728x90

'study > Python 🌼' 카테고리의 다른 글

[Python] 월 단위의 날짜 차이 계산  (0) 2021.07.05
[Python] Mac SSLCertVerificationError  (0) 2021.06.30
[Python] dataclass 모듈 사용법  (1) 2021.05.28
[Python] SQLAlcehmy  (0) 2021.05.28
[Python] 암호화를 하는 bcrypt  (0) 2021.05.28