728x90
모두 클래스나 인스턴스의 메서드나 속성을 다룰 때 사용하는 데코레이터
@staticmethod (정적 메서드)
- 목적: 클래스의 인스턴스나 클래스 자체와는 관계없이 독립적인 함수처럼 동작하는 메서드를 정의할 때 사용됩니다.
- 특징:
- @staticmethod는 클래스나 인스턴스의 상태(속성이나 메서드)에 접근하지 않습니다.
- 첫 번째 인자 self나 cls가 필요하지 않습니다.
- 일반적으로 클래스에 관련된 독립적인 작업을 수행할 때 사용됩니다.
- @staticmethod는 클래스의 상태를 변경하지 않으며, 클래스의 인스턴스화 없이 호출할 수 있습니다.
class MyClass:
@staticmethod
def greet(name):
return f"Hello, {name}!"
print(MyClass.greet("Alice")) # "Hello, Alice!"
@classmethod (클래스 메서드)
- 목적: 클래스 자체에 대한 정보를 다루고자 할 때 사용됩니다. 클래스 레벨에서 작동하며, 클래스 속성에 접근하거나 클래스의 상태를 변경할 수 있습니다.
- 특징:
- @classmethod는 첫 번째 인자로 클래스를 나타내는 cls를 받습니다. 이를 통해 클래스 속성이나 클래스 메서드에 접근할 수 있습니다.
- 인스턴스가 아닌 클래스 자체에 의존하는 동작을 할 때 유용합니다.
class MyClass:
class_variable = "I am a class variable"
@classmethod
def show_class_variable(cls):
return cls.class_variable
print(MyClass.show_class_variable()) # "I am a class variable"
@property (속성 메서드)
- 목적: 클래스의 메서드를 속성처럼 접근할 수 있게 해주는 데코레이터입니다. 메서드처럼 동작하지만, 속성처럼 접근합니다.
- 특징:
- @property는 읽기 전용 속성을 정의할 때 주로 사용됩니다. 메서드를 호출하지 않고 속성처럼 사용할 수 있도록 해줍니다.
- 값을 계산하거나 필터링할 필요가 있을 때 사용됩니다.
- @property는 메서드를 속성처럼 사용하지만, 여전히 메서드 호출이 이루어집니다.
- @property로 만든 속성은 getter 역할을 합니다. 필요에 따라 setter와 deleter를 추가할 수도 있습니다
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, value):
if value < 0:
raise ValueError("Radius cannot be negative")
self._radius = value
circle = Circle(10)
print(circle.radius) # 10
circle.radius = 20 # setter 호출
print(circle.radius) # 20
차이점 요약
주요 목적 | 클래스나 인스턴스와 무관한 함수 | 클래스 자체를 다루는 메서드 | 메서드를 속성처럼 접근 가능하게 만드는 것 |
첫 번째 인자 | 필요 없음 (self, cls 없음) | cls (클래스를 참조) | self (인스턴스를 참조) |
접근 가능한 것 | 클래스/인스턴스의 속성에 접근하지 않음 | 클래스 속성에 접근 가능 | 인스턴스 속성에 접근 가능 |
사용 예시 | 클래스와 무관한 유틸리티 함수 | 클래스 상태를 다루는 메서드 | 클래스 속성처럼 메서드를 다루는 경우 |