[개발] 파이썬

3.3.2. 파이썬 데코레이터

브랜든정 2024. 12. 27. 10:30
반응형

파이썬은 함수와 클래스를 통해 프로그램을 구조화하는 데 유용한 도구입니다. 파이썬 데코레이터는 함수나 클래스에 추가적인 기능을 부여하는 데 사용되는 강력한 도구입니다. 이 글에서는 파이썬 데코레이터 중 @staticmethod와 @classmethod를 사용하는 방법을 자세히 설명할 것입니다. 이러한 데코레이터는 함수와 클래스의 기능을 확장하여 코드의 가독성과 유지보수성을 높일 수 있습니다.

1. @staticmethod의 의미와 활용법

@staticmethod 데코레이터는 메소드가 클래스의 인스턴스를 사용하지 않고 클래스 자체를 사용할 수 있도록 합니다. 이는 메소드가 클래스의 상태를 변경하지 않으며, 따라서 인스턴스 변수를 사용할 수 없습니다.

예시:

class MyClass:
    @staticmethod
    def my_static_method():
        print("This is a static method.")
        return "Hello, World!"

print(MyClass.my_static_method())  # Output: Hello, World!

위 예시에서 my_static_methodMyClass 클래스의 인스턴스를 사용하지 않고 클래스 자체를 사용합니다. 따라서 이 메소드는 인스턴스 변수를 사용할 수 없습니다.

2. @classmethod의 의미와 활용법

@classmethod 데코레이터는 메소드가 클래스를 인자로 받을 수 있도록 합니다. 이는 메소드가 클래스의 상태를 변경할 수 있으며, 따라서 인스턴스 변수를 사용할 수 있습니다.

예시:

class MyClass:
    value = 0

    @classmethod
    def my_class_method(cls):
        cls.value += 1
        return cls.value

print(MyClass.my_class_method())  # Output: 1
print(MyClass.my_class_method())  # Output: 2

위 예시에서 my_class_methodMyClass 클래스를 인자로 받습니다. 따라서 이 메소드는 인스턴스 변수 value를 사용할 수 있습니다.

3. @staticmethod와 @classmethod의 차이점

  • 인스턴스 사용 여부: @staticmethod는 인스턴스를 사용하지 않습니다. 반면, @classmethod는 인스턴스를 인자로 받습니다.
  • 인스턴스 변수 사용 여부: @staticmethod는 인스턴스 변수를 사용할 수 없습니다. 반면, @classmethod는 인스턴스 변수를 사용할 수 있습니다.
  • 클래스 상태 변경: @classmethod는 클래스의 상태를 변경할 수 있습니다. 반면, @staticmethod는 클래스의 상태를 변경할 수 없습니다.

4. 실무에서 활용하는 방법

  • 기능 확장: 데코레이터를 사용하여 함수나 클래스의 기능을 확장할 수 있습니다. 예를 들어, 로깅 기능을 추가하거나, 캐싱 기능을 추가할 수 있습니다.
  • 코드 가독성: 데코레이터를 사용하여 코드의 가독성을 높일 수 있습니다. 예를 들어, 로깅 기능을 추가하여 코드의 로그를 쉽게 확인할 수 있습니다.
  • 유지보수성: 데코레이터를 사용하여 코드의 유지보수성을 높일 수 있습니다. 예를 들어, 캐싱 기능을 추가하여 코드의 성능을 향상시킬 수 있습니다.

5. 예시 시나리오

예시 시나리오 1: 로깅 기능 추가

import logging

class Logger:
    @staticmethod
    def log(message):
        logging.info(message)

class MyClass:
    def __init__(self, name):
        self.name = name

    def do_something(self):
        Logger.log(f"{self.name} is doing something.")
        return f"{self.name} is done."

obj = MyClass("John")
print(obj.do_something())  # Output: John is done.

위 예시에서 Logger 클래스의 log 메소드는 로깅 기능을 추가합니다. MyClass 클래스의 do_something 메소드는 로깅 기능을 사용하여 로그를 출력합니다.

예시 시나리오 2: 캐싱 기능 추가

class Cache:
    @classmethod
    def get(cls, key):
        if key in cls.cache:
            return cls.cache[key]
        else:
            return None

    @classmethod
    def set(cls, key, value):
        cls.cache[key] = value

class MyClass:
    cache = {}

    @classmethod
    def get_data(cls, key):
        data = Cache.get(key)
        if data is None:
            data = cls.fetch_data(key)
            Cache.set(key, data)
        return data

    @classmethod
    def fetch_data(cls, key):
        # Simulate fetching data from database
        return f"Data for {key}"

print(MyClass.get_data("key1"))  # Output: Data for key1

위 예시에서 Cache 클래스의 get 메소드는 캐싱 기능을 추가합니다. MyClass 클래스의 get_data 메소드는 캐싱 기능을 사용하여 데이터를 캐시합니다.

파이썬 데코레이터는 함수나 클래스의 기능을 확장하는 데 유용한 도구입니다. @staticmethod@classmethod는 각각 클래스의 인스턴스를 사용하지 않고 클래스 자체를 사용하거나, 클래스를 인자로 받는 메소드를 생성할 수 있습니다. 이러한 데코레이터를 사용하여 코드의 가독성과 유지보수성을 높일 수 있으며, 실무에서 다양한 기능을 추가할 수 있습니다.

반응형