지난번에 객체의 함수인 instance method를 정리해보았다. 이번에는, instance method와 달리 함수 내에서 주로 Class attribute를 다루기 위한 Class method에 대해 알아보자
Why :
Class attribute 와 Class method 는 같은 클래스를 가진 객체 간 공유하기 원하는 속성과 기능이 필요할 때 활용할 수 있다.
How :
Class attribute를 정의할 때는, init
method 상단에서 class attribute인 price_per_raise
를 선언할 수 있다.접근할 때는 클래스명.클래스메소드명()
, 클래스명.클래스변수
로 가능하고 Class method 내에서 클래스 변수 접근은 인자인 cls
를 활용하여 cls.attribute1
과 같이 가능하다
Class method 를 정의할 때는, decorator를 활용하여 @classmethod
를 method 상단에 정의하고, Class 자신인 cls
를 인자로 받도록 한다.
사용 시 주의 사항
Class 변수 또한 외부에서 직접적인 접근 또는 수정을 권장하지 않기 때문에, 아래의 raise_price
처럼 Class attribute를 접근하거나 수정할 때는 Class method를 통해 가능하도록 설계하는 것이 better code 이다
Class 변수 또한 외부에서 직접적인 접근 또는 수정을 권장하지 않기 때문에, 아래의 raise_price
처럼 Class attribute 값을 접근하거나 수정할 때는 Class method가 이를 수행하도록 설계하는 것이 better code 이다
class Car(object):
# Class Variable
price_per_raise = 1.0
def __init__(self, company, details):
self._company = company
self._details = details
# Instance Method
def get_price(self):
return 'Before Car Price -> company : {}, price : {}'.format(self._company, self._details.get('price'))
# Instance Method
def get_price_culc(self):
return 'After Car Price -> company : {}, price : {}'.format(self._company, self._details.get('price') * Car.price_per_raise)
# Class Method
@classmethod
def raise_price(cls, per):
if per <= 1:
print('Please Enter 1 or More')
return
cls.price_per_raise = per
return 'Succeed! price increased.'
car1 = Car('Bmw', {'color' : 'Black', 'horsepower': 270, 'price': 5000})
print(car1.get_price()) # Before Car Price -> company : Bmw, price : 5000
# 가격 인상(Class method 미사용) - 안좋은 예
Car.price_per_raise = 1.6
# 가격 인상(Class method 사용) - 좋은 예**
Car.raise_price(1.6)
# 가격 정보(인상 후)
print(car1.get_price_culc()) # After Car Price -> company : Bmw, price : 8000.0
<Reference>
우리를 위한 프로그래밍 : 파이썬 중급 (인프런)
__dict__와 dir (0) | 2022.04.05 |
---|---|
Class와 method 활용 (5) - Static method (0) | 2022.04.04 |
Class와 method 활용 (3) - instance method (0) | 2022.04.02 |
Class와 method 활용 (2) - Class 설계하기 (0) | 2022.04.01 |
Class와 method 활용 (1) - Class를 활용한 OOP의 장점 (0) | 2022.03.30 |
댓글 영역