본문 바로가기
파이썬/파이썬 기초 문법

클로저와 데코레이터

by 쵠몽 2024. 10. 14.

1. 클로저

내부 함수가 외부 함수의 스코프에서 정의된  변수를 참조할 수 있는 기능이다.

def mul2(n):
    return n*2
    
print(mul2(10))
print(mul2(5))

def mul5(n):
    return n*5
    
print(mul5(10))
print(mul5(5))
class Mul:
    def __init__(self, m):
        self.m = m
    def mul(self, n):
        return self.m*n
        
mul2 = Mul(2)
print(mul2.mul(10))
print(mul2.mul(5))

mul5 = Mul(5)
print(mul5.mul(10))
print(mul5.mul(5))
class Mul:
    def __init__(self, m):
        print('생성자 호출-1')
        self.m = m

    def __call__(self, n):
        print('call 호출-2')
        return self.m * n
        
mul2 = Mul(2)
mul2(10)
# 클로저 사용하기
def mul(m):
    def wrapper(n):
        return m * n
    return wrapper
    
mul2 = mul(2)
'''
    def wrapper(n):
        return 2 * n
'''
print(mul2(10))

mul5 = mul(5)

print(mul5(10))

 

 

2. 데코레이터(Decorator)

주로 함수나 메서드의 전후에 동작을 수정하거나 확장하는 등 추가적인 기능을 삽입하는 데 사용된다. 원래 함수를 변경하지 않고도 기능을 확장시킬 수 있으며 @ 기호를 사용한다.

import time

def func1(a, b):
    start = time.time()
    print('함수가 시작되었습니다')

    result = a + b

    end = time.time()
    print(f'함수 수행 시간:{end - start}')
    return result
    
result = func1(10, 3)
print(result)

def func2(a, b):
    start = time.time()
    print('함수가 시작되었습니다')

    result = a * b

    end = time.time()
    print(f'함수 수행 시간:{end - start}')
    return result
    
result = func2(10, 3)
print(result)
def func1(a, b):
    result = a + b
    return result

def func2(a, b):
    result = a * b
    return result
    
def elapsed(func):
    def wrapper(a, b):
         start = time.time()
         print('함수가 시작되었습니다')

         result = func(a, b)

         end = time.time()
         print(f'함수 수행 시간:{end - start}')
         return result
    return wrapper
    
deco1 = elapsed(func1)
result = deco1(10, 3)
print(result)

deco2 = elapsed(func2)
result = deco2(10, 3)
print(result)
@elapsed
def func1(a, b):
    result = a + b
    return result

@elapsed
def func2(a, b):
    result = a * b
    return result

@elapsed
def func3(a, b):
    result = a / b
    return result
    
result = func1(10, 3)
print(result)

result = func2(10, 3)
print(result)

result = func3(10, 3)
print(result)

'파이썬 > 파이썬 기초 문법' 카테고리의 다른 글

파이썬 스페셜 메서드  (4) 2024.10.19
파이썬 상속  (2) 2024.10.19
객체지향과 클래스  (0) 2024.10.14
파이썬 콜백 함수와 람다 함수  (1) 2024.10.07
파이썬 변수의 범위  (2) 2024.09.30