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

+ Recent posts