상세 컨텐츠

본문 제목

클로저와 데코레이터

인공지능/파이썬

by Ryuzy 2024. 11. 5. 16:37

본문

728x90
반응형

1. 클로저

클로저(Closure)는 내부 함수가 자신을 감싸고 있는 외부 함수의 변수에 접근할 수 있는 특성을 가지며, 외부 함수가 호출된 후에도 그 변수의 상태를 기억하고 사용할 수 있는 기능으로, 주로 데이터 은닉과 상태 유지에 활용됩니다.

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

def mul5(n):
    return n * 5
    
print(mul5(10))
print(mul5(5))

 

# mul1, mul2, mul3 ... mul100도 만들어야 하나?

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('생성자 호출')
        self.m = m
    def __call__(self, n):
        print('call 호출')
        return self.m * n
 
mul2 = Mul(2)
print(mul2(10))
 
mul5 = Mul(5)
print(mul5(10))

 

# 클로저 사용하기
def mul(m):
    def wrapper(n):
        return m * n
    return wrapper

mul2 = mul(2)
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
    
result = func1(10, 3)
print(result)

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

 

728x90
반응형

'인공지능 > 파이썬' 카테고리의 다른 글

파이썬 비동기 프로그래밍  (1) 2024.12.04
파일 입출력 라이브러리  (0) 2023.09.14
파이썬 모듈  (0) 2023.09.13
타입 어노테이션  (0) 2023.09.12
파일 입출력  (0) 2023.09.12

관련글 더보기