메소드를 속성처럼 접근할 수 있게 해준다. 해당 메소드를 호출할 때 ()
를 붙이지 않고도 속성처럼 사용할 수 있다.
주로 속성 값을 정의, 동적으로 계산하거나 속성에 접근할 때 사용한다.
클래스 메소드를 정의할 때 사용한다. 클래스 전체에 영향을 주는 동작을 정의할 때 유용하다. 첫번째 인자로 클래스 자체를 받는 cls
인자를 받으며 보통 cls
를 이용해 클래스 레벨의 속성이나 다른 클래스 메소드에 접근한다.
class Calc:
@classmethod
def add(cls, a, b):
return a + b
cal = Calc()
cal.add(2, 4) # return 6
정적 메소드를 정의할 때 사용한다. 클래스나 인스턴스와 무관하게 동작하는 메소드이다. 클래스나 인스턴스의 상태를 변경하지 않고 단순히 로직을 수행할 때 사용한다.
class Calc:
@staticmethod
def add(a, b):
return a + b
cal = Calc()
cal.add(2, 4) # return 6
두 메소드는 상속에서 다르다. @classmethod
의 경우에는 cls 인자를 활용하여 현재 클래스의 속성을가져오지만 @staticmethod
의 경우에는 부모 클래스의 클래스 속성 값을 가져온다.
class Fruit:
default = 'apple'
def __init__(self):
self.data = self.default
@classmethod
def class_fruit(cls):
return cls()
@staticmethod
def static_fruit():
return Fruit()
class WhatFruit(Fruit):
default = 'melon'
fruit1 = WhatFruit.class_fruit() # return 'melon'
fruit2 = WhatFruit.static_fruit() # return 'apple'