파이썬 - 데코레이터(4)

정태경·2022년 1월 15일
0

데코레이터

  • 함수 앞 뒤에 기능을 추가해서 손쉽게 함수를 활용할 수 있는 기법

데코레이터의 활용

  • 여러 함수에 동일한 기능을 @데코레이터 하나로 간편하게 추가할 수 있다
# decorator 함수 정의
def outer_func(function):
    def inner_func():
        print('decoration added')
        function()
    return inner_func

def log_func():
    print('logging')

decorated_func = outer_func(log_func)
decorated_func()

""" 위 코드를 데코레이터 적용해보면 다음과 같이 바꿀 수 있음. """

# decorator 함수 정의
def outer_func(function):
    def inner_func():
        print('decoration added')
        function()
    return inner_func

@outer_func
def log_func():
    print('logging')

log_func()
  • 함수 파라미터의 유효성 체크로도 활용이 가능하다
def type_checker(func):
    def check(digit1, digit2):
        if (type(digit1) != int) or (type(digit2) != int):
            return print("정수가 아닙니다")
        func(digit1,digit2)
    return check

""" 위 코드를 보면, 넘겨 받는 인자가 정수가 아닐 때 데코레이터에서 유효성 체크로 걸러낼 수 있다 """

@type_checker
def calc(digit1, digit2):
    print(digit1 * digit2)
  • 여러 데코레이터 사용하기
def decorater(fuc):
    def inner_func():
        print("데코레이터")
        fuc()
    return inner_func

def decorater1(fuc):
    def inner_func():
        print("데코레이터1")
        fuc()
    return inner_func

@decorater
@decorater1
def hello():
    print("헬로")

hello()

""" 데코레이터
    데코레이터1
    헬로       """
  • 클래스 내에서 데코레이터 사용하기
def hi_tag(func):
    def inner_func(self, *arg, **kwargs):
        return '<h1>{0}</h1>'.format(func(self, *arg, **kwargs))
    return inner_func

""" 클래스 내에서 사용할 데코레이터는 self 를 첫번째 인자로 넘겨준다. """

class Person:
    def __init__(self, first_name, last_name):
        self.first_name = first_name
        self.last_name = last_name

    @hi_tag
    def get_name(self):
        return self.first_name + self.last_name

a = Person("태경", "정")

print(a.get_name())
  • 데코레이터에 인자 사용하기
def decorater(a,b): # 데코레이터로 넘겨받을 인자 
    def outter_func(func): # 데코레이터 밑에 넘겨받을 함수
        def inner_func(args):
            return a + func(args) + b
        return inner_func
    return outter_func

@decorater('<i>', '</i>')
def test(string):
    return string

print(test('무야홍~'))
profile
現 두나무 업비트 QA 엔지니어, 前 마이리얼트립 TQA 엔지니어

0개의 댓글