파이썬에서는 다양한 유용한 데코레이터들이 있습니다. 여러 데코레이터 중에서 주요한 데코레이터 몇 가지를 소개하고, 간단한 예제를 작성해보겠습니다.
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
위에서 소개한 데코레이터들은 파이썬 코드를 작성할 때 유용하게 사용되는 일부 데코레이터의 예시입니다. 이들 데코레이터를 적절히 사용하면 코드의 가독성과 유지보수성을 높일 수 있습니다.
'Programming > python' 카테고리의 다른 글
python 에서 global, protected, private에 대해서 알아보자 (전역과 보호) (0) | 2023.07.25 |
---|---|
python lambda에 대해서 알아보자 (0) | 2023.07.25 |
python decorators에 대해서 알아보자 (0) | 2023.07.25 |
python Scope Resolution(스코프 결정)에 대해서 알아보자 (0) | 2023.07.25 |
python의 namespaces에 대해 알아보자 (0) | 2023.07.25 |