✨Decorator

Haks.·2024년 12월 30일
0

How to use

목록 보기
10/32

📖 데코레이터

📌 First-class function

다음과 같이 다룰 수 있는 함수를 first-class 함수라 부름

  • 함수 자체를 변수에 저장 가능
  • 함수의 인자에 다른 함수를 인수로 전달 가능, func1(func2)
  • 함수의 반환 값으로 함수를 전달 가능
  • 삭제해도 그전에 저장해 놓았으면 함수의 기능은 살아있다 변수에서만
  • 내장 함수 부를때 () 써야 함수가 실행되는거임
def list_creator(tag):
    def text_wrapper(msg):
        for i in msg:
            print ('{0} {1}'.format(tag,i)) 
    return text_wrapper

data_list = list_creator('-')
data_list(['안녕','하세요']) # 그 안에 있는 함수에 넣을 때에는 또 변수를 넣어서 사용해야한다.

def list_creator2(tag):
    def text_wrapper(list_msg):
        for msg in list_msg:
            print('{} {}'.format(tag, msg))
    return text_wrapper

data_list2 = list_creator2('+')
data_list2(['바보','멍청이'])

📌 Closure function

함수에 있는 데이터를 함께 복사, 저장해서 별도 함수로 활용하는 기법
외부 함수가 소멸되더라도, 외부 함수안에 있는 로컬 변수 값과 중첩함수를 사용할 수 있는 기법

  • closure 는 객체와 유사
  • 일반적으로 제공해야할 기능이 적은경우, 클로져를 사용하기도 함
  • 제공해야할 기능(method) 가 많은 경우등은 class를 사용해서 구현
def outer_func(num):
    def inner_func():
        print(num)
        return '안녕'

    return inner_func
clousre_func = outer_func(10)
clousre_func()

del outer_func

print(clousre_func())
a=clousre_func()

📌 Decorator

데코레이터 -> 함수 순으로 출력, 데코레이터 함수 안에서 함수가 실행되는 것

def datetime_decorator(func): # 데코레이터 특징임 함수위에 붙이는거니까 그함수가 들어갔을때 자동으로 그함수가 들어감
    def wrapper():
        print('time' + str(datetime.datetime.now()))
        func()
        print(datetime.datetime.now())
    return wrapper

# 데코레이터로 감싼 함수가 제일 먼저 실행 된다 생각하고 안에 안에 가 함수가 실행되는 개념임
@datetime_decorator
def logger_login():
    print("hak")

logger_login()
def type_checker(function) :
    def inner_func(digit1,digit2):
        if (type(digit1) != int) or (type(digit2) != int):
            return 'only integer support'
        return function(digit1,digit2) 
    return inner_func

@type_checker
def muliplexer(digit1, digit2):
    return print(digit1 * digit2)

muliplexer(11,2) # 반환 되지않음
def general_decorator(func):
    def wrapper(*args, **kwargs):
        print('function is decorated')
        return func(*args, **kwargs)
    return wrapper
    
@general_decorator
def calc_quad(digit1, digit2, digit3, digit4):
    return digit1 * digit2 * digit3 * digit4 

calc_quad(2,3,4,5)
def decorator1(func):
    def wrapper():
        print('decorator1')
        func()
    return wrapper
def decorator2(func):
    def wrapper():
        print('decorator2')
        func()
    return wrapper

@decorator1
@decorator2
def hello():
    print('hello')

hello()
# decorator1
# decorator2
# hello
  • Class Decorator

    사용할 데코레이터에 self 를 넣어줘야함

def h1_tag(function):
    def wrapper(self, *args, **kwargs):
        return "<h1>{}</h1>".format(function(self, *args, **kwargs)) # 함수에도 self 넣어야함
    return wrapper
    
class Person:
    def __init__(self, first, last):
        self.first = first
        self.last = last

    @h1_tag
    def get_name(self):
        return self.first + ' ' + self.last

hak = Person('kim','byunghak')
print(hak.get_name())
  • 파라미터가 있는 데코레이터 만들기
    • 중첩함수의 함수를 실행시키려면 2차원 배열처럼 () () 안에 게속해서 맞는 인수를 추가해 주면 된다.
def decorator(num):
    def outer_wrapper(function):
        def innter_wrapper(*args, **kwargs):
            print('decorator1 {}'.format(num))
            return function(*args, **kwargs)
        return innter_wrapper
    return outer_wrapper

def print_hello():
    print('hello')

print_hello2 = decorator(1)(print_hello)
print_hello2()

@decorator(1)
def print_hello():
    print('hello')

print_hello()
# decorator1 1
# hello

# 예제 2

def mark_html(tag):
    def outer_wrapper(function):
        def innter_wrapper(*args, **kwargs):
            return '<' + tag + '>' + function(*args, **kwargs) + '</' + tag + '>'
        return innter_wrapper
    return outer_wrapper

@mark_html('h')
def print_title(title):
    return title

print(print_title('hak'))
<h>hak</h>

# 예제 3
def type_checker(func):
    def wrapper(digit1,digit2):
        if type(digit1) == int and type(digit2) == int:
            return func(digit1,digit2)
        else:
            return 'only ineger support'
    return wrapper

@type_checker
def mul(digit1,digit2):
    return print(digit1 * digit2)

mul(1,4)

# 예제 4
def tag(tag):
    def mark(function):
        def wrapper(*args,**kwargs):
            return f'<{tag}>{function(*args,**kwargs)}</{tag}>'
        return wrapper
    return mark
@tag('b')
def add_html(string):
    return string

print(add_html('하이'))

0개의 댓글

관련 채용 정보