300x250
_로 시작하는 변수 (getter, setter)
(참고: https://www.daleseo.com/python-property/)
: 외부에서 직접 접근이 어려운 변수 (클래스 인스턴스의 내부 데이터를 보호하기 위함)
class Person:
def __init__(self, first_name, last_name, age):
self.first_name = first_name
self.last_name = last_name
self.set_age(age)
def get_age(self): ## getter
return self._age # 외부에서 직접 접근을 하지 못하고, getter를 통해서만 가능
def set_age(self, age): ## setter
if age < 0:
raise ValueError("Invalid age")
self._age = age
property()
: getter, setter로 변수를 관리하면 변수에 대한 접근이 지저분해진다는 단점이 생김
(property 함수로 지정해주면 field처럼 사용할 수 있음)
아래 코드를 위의 class 코드에 추가해주면 된다.
age = property(get_age, set_age)
@property
: property함수를 따로 콜하지 않고, 데코레이터를 이용해서 property 기능 구현 가능
class Person:
def __init__(self, first_name, last_name, age):
self.first_name = first_name
self.last_name = last_name
self.age = age
@property
def age(self):
return self._age
@age.setter
def age(self, age):
if age < 0:
raise ValueError("Invalid Age")
self._age = age
이때 getter 메소드에서 get_을 지워주고 @property를 달아줌. 그리고 setter 메소드인 set_age에서도 set_을 지우고 @age.setter를 달아주면 됨. (@<필드명>.setter)
python decorator (@)
(참고: https://dojang.io/mod/page/view.php?id=2427)
데코레이터는 함수를 수정하지 않은 상태에서 추가 기능을 구현할 때 사용한다. 위에서도 함수를 수정하지 않은 상태로 @property를 붙여줌으로써 해당 함수에 property() 함수의 기능을 부여했다.
여러 개의 함수에 기능을 추가 구현하고 싶을 때, 모든 함수를 다 수정하는 것은 어려우므로 위와 같은 방식을 사용하는 것.
데코레이터는 아래와 같이 함수를 감싸는 형태(decorate 함수는 함수 안에서 함수를 만들고 반환하는 클로저 형태)이므로, 함수를 수정하지 않고도 추가 기능을 구현할 수 있다.
def decorate1(func): # 호출할 함수를 매개변수로 받음
def wrapper(): # 호출할 함수를 감싸는 함수 (wrapper 아닌 다른 이름을 사용해도 무방함)
print('decorate1') # 여기서는 함수 이름 출력하는 기능을 하도록 함
func() # 매개변수로 받은 함수를 호출
return wrapper # wrapper 함수 반환
def decorate2(func):
def wrapper():
print('decorate2')
func()
return wrapper
# 데코레이터 여러 개 지정 가능
@decorate1
@decorate2
def hello_world():
print("hello world")
300x250
'프로그래밍 > Python ' 카테고리의 다른 글
[python] install error (disutil 관련) (0) | 2022.03.28 |
---|---|
[python] Counter (0) | 2021.12.09 |
[Python] for ~ else (0) | 2021.12.09 |
[파이썬 머신러닝 완벽가이드] Chap2. 사이킷런으로 시작하는 머신러닝 (0) | 2021.01.21 |
Hyper parameter tuning (0) | 2019.08.15 |