@classmethod 와 @staticmethod

인스턴스 메서드, 클래스 메서드, 정적 메서드 차이점

  1. 인스턴스 메서드(Instance Methods): 이 메서드들은 클래스의 객체 인스턴스에서 호출되며, 첫 번째 인자로 인스턴스 자체(self)를 받습니다. 인스턴스 변수에 접근하여 값을 읽거나 수정할 수 있습니다.
  1. 클래스 메서드(Class Methods): 클래스 메서드는 클래스에서 호출되며, 첫 번째 인자로 클래스(cls)를 받습니다. 이 메서드들은 클래스 변수를 수정하는 데 사용될 수 있습니다. 인스턴스에 대한 정보는 사용할 수 없습니다.

  2. 정적 메서드(Static Methods): @staticmethod 데코레이터로 표시된 메서드는 인스턴스나 클래스에 대한 참조 없이 동작합니다. 이 메서드들은 클래스나 인스턴스 상태를 수정할 필요가 없는 경우에 사용됩니다.

@classmethod

@classmethod 데코레이터는 메서드를 클래스 메서드로 표시하는 데 사용됩니다. 일반적인 인스턴스 메서드와 달리 클래스 메서드는 클래스 자체를 첫 번째 인자로 받습니다(일반적으로 cls로 표시됩니다), 그리고 객체 인스턴스가 아닌 클래스를 조작합니다.

예시

class MyClass:
    class_variable = "I am a class variable"

    def __init__(self, instance_variable):
        self.instance_variable = instance_variable

    def instance_method(self):
        print(f"Instance method, instance variable: {self.instance_variable}")

    @classmethod
    def class_method(cls):
        print(f"Class method, class variable: {cls.class_variable}")

    @staticmethod
    def static_method():
        print("Static method, no access to class or instance variables")


# 인스턴스 생성
my_instance = MyClass("I am an instance variable")

# 인스턴스 메서드 호출
my_instance.instance_method()  
# Instance method, instance variable: I am an instance variable

# 클래스 메서드 호출
MyClass.class_method()  
# Class method, class variable: I am a class variable

# 정적 메서드 호출
MyClass.static_method()  
# Static method, no access to class or instance variables

@classmethod는 주로 클래스 변수를 조작하거나, 클래스에 대한 상태를 변경할 때 사용됩니다. 또한, 인스턴스를 생성하지 않고도 클래스의 기능을 사용할 수 있게 해줍니다.

@staticmethod

@staticmethod 데코레이터는 메서드를 정적(static) 메서드로 지정합니다. 정적 메서드는 클래스와 관련이 있지만 클래스나 인스턴스의 상태에 영향을 받지 않으며, 인스턴스 메서드와 달리 selfcls와 같은 첫 번째 매개변수를 갖지 않습니다.

따라서 @staticmethod를 사용하여 정의된 메서드는 클래스의 인스턴스 없이도 호출할 수 있으며, 클래스 내부의 다른 메서드나 속성에 접근할 수 있습니다.

아래 예시 코드에서 @staticmethod를 사용한 이유는 Serializer 클래스의 serialize() 메서드를 클래스 메서드로 정의하고자 했기 때문입니다. @staticmethod를 사용하면 serialize() 메서드를 인스턴스화하지 않고도 직접 호출할 수 있으며, 클래스 내부의 다른 메서드나 속성에 접근할 수 있습니다.

class UserSerializer:
    @staticmethod
    def serialize(user):
        # 직렬화 로직
        return serialized_data

이렇게 하면 UserSerializer.serialize(user)와 같은 형태로 메서드를 호출할 수 있습니다.

정적 메서드는 클래스의 상태와 관련이 없는 유틸리티 메서드를 정의하거나, 클래스와 밀접한 연관이 있는 로직을 모듈화하고 싶을 때 유용하게 사용될 수 있습니다.

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

Python - isinstance()  (0) 2023.08.12
Python) 위치 인자, 키워드 인자  (0) 2023.07.25
@property 데코레이터  (0) 2023.07.01
glob.glob() 함수  (0) 2023.06.11
Python 라이브러리 - functools  (0) 2023.05.24