728x90
1. 데코레이터
* 꾸며주는(기능을 추가해주는) 역할을 하는 함수 또는 클래스
* 기능이 추가된 새로운 함수를 만들고 이 함수를 반환한다.
* @를 사용해 데코레이터를 간단하게 구현할 수 있는데, '@func' 는 이후 등장하는 함수(def a라고 가정)를 @ 뒤에 있는 func에 전달하고 반환된 함수를 다시 a 에 담는다.
# 성적 평균에 따라 PASS 또는 FAIL을 붙혀주는 데코레이터 예시
def deco_pf(func):
if func > 80:
print("---PASS---")
print(func)
print("---PASS---")
else:
print("---FAIL---")
print(func)
print("---FAIL---")
class Student:
def __init__(self, java, c, py):
self.j = java
self.c = c
self.p = py
def avg(self):
return (self.j+self.c+self.p)//3
def main():
st1 = Student(92, 88, 91)
st1 = st1.avg()
deco_pf(st1)
# ---PASS---
# 90
# ---PASS---
st2 = Student(78, 66, 82)
st2 = st2.avg()
deco_pf(st2)
# ---FAIL---
# 75
# ---FAIL---
main()
# 패킹 언패킹 개념이 포함된 데코레이터 예시
def deco_score(func):
def deco(*avg): # 패킹으로 매개변수를 묶어서 받는다
print(*avg, sep=' + ', end=' ') # 패킹 처리된 매개변수가 언패킹된다
print('// 3 = {}'.format(func(*avg))) # 언패킹
return deco
def avg(java, c, py):
return (java + c + py)//3
avg = deco_score(avg) # deco_score 함수 내에 있는 func 가 avg 함수를 참조함
print(avg(77, 88, 99)) # 여러개의 인자가 전달되었기 때문에 deco 함수에서 패킹되어서 받음
# @기반으로 데코레이터를 구현한 예시
def deco_score(func):
def deco(*avg):
print(*avg, sep=' + ', end=' ')
print('// 3 = {}'.format(func(*avg)))
return deco
@deco_score # avg 함수가 deco_score 에 전달되고, 반환되는 함수(deco)를 다시 avg 에 담는다.
def avg(java, c, py):
return (java + c + py)//3
avg(77, 88, 99)
728x90
'# Programming Language > Python' 카테고리의 다른 글
[Python] 파이썬 정리(18)_ __name__과 __main__ (0) | 2021.07.31 |
---|---|
[Python] 파이썬 정리(17)_클래스 메소드/static 메소드 (0) | 2021.07.31 |
[Python] 파이썬 정리(15)_프로퍼티 (0) | 2021.07.31 |
[Python] 파이썬 정리(14)_dict가 주는 메모리 부담 해결하는 __slots__ (0) | 2021.07.31 |
[Python] 파이썬 정리(13)_정보은닉/__dict__ (0) | 2021.07.31 |