class C:
def __init__(self):
self.__age = 12
def print_age(self):
return self.__age
def change_age(self, new_age):
self.__age = new_age
age = property(print_age, change_age)
a.__age = 13
위 코드를 실행하면 __age는 private 로 되어있기 때문에 오류가 뜬다.
그래서 __age를 보거나 변경할 때 클래스 내 get, set 함수를 구현하여 변경한다. 위 코드에선
print_age와 change_age를 사용해야한다.
a.change_age(3)
a.print_age()
이를 한번에 property 함수를 이용해 a.age 를 사용 가능하게 할 수 있다.
a.age = 13
a.age
# 13 출력
내가 헷갈려 했던 것은 property함수가 change_age 함수를 인자로 받았기 때문에 a.age(13) 해야 하지 않을까 라는 생각이 났다. 그냥 property함수는 private 변수를 일반처럼 접근 가능하게 한다고 이해하면 쉽다.
property 함수를 데코레이터로 사용하면 아래와 같이 간단하게 짤 수 있다. property를 데코레이터로 사용하면
class의 getter, setter 를 쉽게 사용하게 해준다.
class C:
def __init__(self):
self.__age = 12
@property
def age(self):
return self.__age
@age.setter
def age(self, age):
self.__age = age
@age.setter 부문은 세부적으로 이해안하고 그냥 이렇게 쓰면 되는구나 하고 넘어갔다. 그래야 쉬운듯 하다.
데코레이터 제대로 이해하기
def star(func):
def inner(*args, **kwargs):
print(args[1] * 30)
func(*args, **kwargs)
print(args[1] * 30)
return inner
@star
def printer(msg, mark):
print(msg)
printer("Hello", '&')
'''출력결과
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Hello
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
'''
함수 정의 위에 데코를 하면 그 함수가 데코 함수에 들어 간다고 생각.
좀만 더 복잡하게 데코 2번 한 경우
def star(func):
def inner(*args, **kwargs):
print("*" * 30)
func(*args, **kwargs)
print("*" * 30)
return inner
def percent(func):
def inner(*args, **kwargs):
print("%" * 30)
func(*args, **kwargs)
print("%" * 30)
return inner
@star
@percent
def printer(msg):
print(msg)
printer("Hello")
'''출력결과
******************************
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Hello
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
******************************
'''
데코레이터에 파라미터 있는 경우
데코레이터 함수안에 wrapper 함수 추가하여 구현 가능
def generate_power(exponent):
def wrapper(f):
def inner(*args):
result = f(*args)
return exponent**result
return inner
return wrapper
@generate_power(2)
def raise_two(n):
return n**2
print(raise_two(7))
'부스트캠프 AI Tech > Python' 카테고리의 다른 글
[09] File Handling (0) | 2022.01.14 |
---|---|
[08] Exception (0) | 2022.01.14 |
[06] Class, Inheritance, Visibility (0) | 2022.01.13 |
[05] 가변인자 (0) | 2022.01.12 |
[04] Black으로 파이썬 코드 스타일 통일하기 (0) | 2022.01.12 |