본문 바로가기

Programming/python

python의 주요 decorator에 대해서 알아보자

파이썬에서는 다양한 유용한 데코레이터들이 있습니다. 여러 데코레이터 중에서 주요한 데코레이터 몇 가지를 소개하고, 간단한 예제를 작성해보겠습니다.

1. `@staticmethod`

  정적 메서드를 정의할 때 사용합니다. 정적 메서드는 클래스의 인스턴스 없이 호출될 수 있습니다.

class MathUtils:
    @staticmethod
    def add(x, y):
        return x + y

# 클래스 인스턴스 없이 정적 메서드 호출
result = MathUtils.add(5, 3)
print(result)  # Output: 8



2. `@classmethod`

  클래스 메서드를 정의할 때 사용합니다. 클래스 메서드는 클래스 자체를 첫 번째 인자로 받으며, 인스턴스를 사용하지 않아도 호출할 수 있습니다.

class MathUtils:
    factor = 10

    @classmethod
    def multiply(cls, x):
        return cls.factor * x

# 클래스 메서드 호출
result = MathUtils.multiply(5)
print(result)  # Output: 50



3. `@property`

  속성을 읽기 전용으로 만들어줍니다. 속성에 접근할 때 자동으로 호출되며, 값을 계산하거나 다른 속성에 의존하여 값을 반환할 수 있습니다.

class Circle:
    def __init__(self, radius):
        self._radius = radius

    @property
    def radius(self):
        return self._radius

    @property
    def area(self):
        return 3.14 * self._radius ** 2

# 속성 접근
circle = Circle(5)
print(circle.radius)  # Output: 5
print(circle.area)    # Output: 78.5



4. `@abstractmethod`

   추상 메서드는 선언만 있고 실제 구현은 없는 메서드로, 해당 클래스를 상속받은 하위 클래스에서 반드시 구현되어야 합니다. 

추상 메서드를 정의하기 위해서는 `abc` 모듈에서 `ABC` 클래스와 `abstractmethod` 데코레이터를 import 해야 합니다.

다음은 `@abstractmethod`를 사용하여 추상 클래스를 정의하고 하위 클래스에서 반드시 구현해야 하는 예제입니다:

from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        pass

class Circle(Shape):
    def __init__(self, radius):
        self._radius = radius

    def area(self):
        return 3.14 * self._radius ** 2

class Rectangle(Shape):
    def __init__(self, width, height):
        self._width = width
        self._height = height

    def area(self):
        return self._width * self._height

# 추상 클래스인 Shape를 직접 인스턴스화할 수 없습니다.
# shape = Shape()  # TypeError 발생

# Circle과 Rectangle 클래스는 추상 메서드인 area()를 반드시 구현해야 합니다.
circle = Circle(5)
rectangle = Rectangle(4, 6)

print("Circle Area:", circle.area())       # Output: 78.5 (3.14 * 5^2)
print("Rectangle Area:", rectangle.area()) # Output: 24 (4 * 6)


위 예제에서 `Shape` 클래스는 추상 클래스로 선언되어 있습니다. `area` 메서드에 `@abstractmethod` 데코레이터를 사용하여 추상 메서드를 정의했습니다. 이렇게 정의된 추상 클래스는 직접 인스턴스화가 불가능합니다.

`Circle` 클래스와 `Rectangle` 클래스는 `Shape` 클래스를 상속받으며, `area` 메서드를 반드시 구현하도록 되어 있습니다. 각각의 클래스에서 `area` 메서드를 구현하여 도형의 면적을 계산할 수 있습니다.

추상 클래스를 사용하면 특정 메서드들을 하위 클래스에서 반드시 구현하도록 강제할 수 있으므로, 클래스의 계층 구조를 명확하게 정의하고 확장성을 높이는 데 유용합니다.

5. `@cache`

함수의 결과를 캐시하여 중복 계산을 방지합니다. `functools` 모듈에 있는 `lru_cache` 데코레이터를 사용합니다.

from functools import lru_cache

@lru_cache(maxsize=None)
def fibonacci(n):
    if n <= 1:
        return n
    else:
        return fibonacci(n-1) + fibonacci(n-2)

result = fibonacci(10)
print(result)  # Output: 55


위에서 소개한 데코레이터들은 파이썬 코드를 작성할 때 유용하게 사용되는 일부 데코레이터의 예시입니다. 이들 데코레이터를 적절히 사용하면 코드의 가독성과 유지보수성을 높일 수 있습니다.

반응형