๋ฐ์ฝ๋ ์ดํฐ๋? โจ
1. ๋ฐ์ฝ๋ ์ดํฐ ์ ์
- ๋ฐ์ฝ๋ ์ดํฐ๋ ๊ธฐ์กด์ ํจ์๋ ๋ฉ์๋์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฑฐ๋ ์์ ํ ์ ์๋ ํ์ด์ฌ์ ๊ณ ๊ธ ๊ธฐ๋ฅ์ด๋ค
- ๋ค๋ฅธ ํจ์๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ณ ์ฐจ ํจ์(Higher-Order Function)์ ์ผ์ข ์
- ์ฃผ๋ก ํจ์๋ ๋ฉ์๋์ ์ ํ์ ์คํ๋ ๋ก์ง์ ์ถ๊ฐํ ๋ ์ฌ์ฉํ๋ค
2. ๋ฐ์ฝ๋ ์ดํฐ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ
- ๊ธฐ๋ณธ ํจ์
def my_function():
print("Hello, World!")
- ๋ฐ์ฝ๋ ์ดํฐ ํจ์ ์ ์
def my_decorator(func):
def wrapper():
print("Before the function call")
func() # ์๋ ํจ์ ์คํ
print("After the function call")
return wrapper
- ํจ์์ ๋ฐ์ฝ๋ ์ดํฐ ์ ์ฉ
@my_decorator
def my_function():
print("Hello, World!")
- ์คํ ๊ฒฐ๊ณผ
my_function()
# ์ถ๋ ฅ:
# Before the function call
# Hello, World!
# After the function call
3. ๋ฐ์ฝ๋ ์ดํฐ์ ์ฃผ์ ํน์ง
- ํจ์๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ์
๋ฐ์ฝ๋ ์ดํฐ๋ ์๋์ ํจ์๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋ฐ์ ๊ฐ์ธ๋ ๋ํผ(wrapper) ํจ์์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ์ด๋ค - ๋ํ(Wrapping)
์๋ ํจ์์ ๋์์ ๊ฐ์ธ์ ํ์ฅํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์์ - `@` ๊ตฌ๋ฌธ
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ ๋ `@decorator_name`์ ํจ์ ์ ์ ๋ฐ๋ก ์์ ์ถ๊ฐํด์ค๋ค
4. ๋ฐ์ฝ๋ ์ดํฐ์ ์์ฉ ์์
1. ํจ์ ์คํ ์๊ฐ ์ธก์ import time
def timer_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"Function {func.__name__} took {end_time - start_time:.2f} seconds")
return result
return wrapper
@timer_decorator
def slow_function():
time.sleep(2)
print("Function complete")
slow_function()
# ์ถ๋ ฅ:
# Function complete
# Function slow_function took 2.00 seconds
2. ๊ถํ ํ์ธ
def requires_permission(permission):
def decorator(func):
def wrapper(user, *args, **kwargs):
if user.get("permission") == permission:
return func(user, *args, **kwargs)
else:
print("Permission denied!")
return wrapper
return decorator
@requires_permission("admin")
def admin_task(user):
print("Performing admin task")
user1 = {"name": "Alice", "permission": "admin"}
user2 = {"name": "Bob", "permission": "user"}
admin_task(user1) # ์ถ๋ ฅ: Performing admin task
admin_task(user2) # ์ถ๋ ฅ: Permission denied!
3. ๋ก๊น ์ถ๊ฐ
def log_decorator(func):
def wrapper(*args, **kwargs):
print(f"Calling function: {func.__name__} with arguments {args} and {kwargs}")
result = func(*args, **kwargs)
print(f"Function {func.__name__} returned {result}")
return result
return wrapper
@log_decorator
def add(a, b):
return a + b
add(3, 4)
# ์ถ๋ ฅ:
# Calling function: add with arguments (3, 4) and {}
# Function add returned 7
5. ๋ฐ์ฝ๋ ์ดํฐ์ ๋งค๊ฐ๋ณ์ ์ฒ๋ฆฌ
- ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ ์ ์๋ ๊ฒฝ์ฐ์๋ 3๋จ๊ณ ์ค์ฒฉ ํจ์๋ฅผ ์ฌ์ฉํจ
def repeat(n): # ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๋ ๋ฐ์ฝ๋ ์ดํฐ
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(n):
func(*args, **kwargs)
return wrapper
return decorator
@repeat(3)
def say_hello():
print("Hello!")
say_hello()
# ์ถ๋ ฅ:
# Hello!
# Hello!
# Hello!โ
6. ํด๋์ค์ ๋ฐ์ฝ๋ ์ดํฐ ์ฌ์ฉ
- ํด๋์ค ๋ฉ์๋ ๋ฐ์ฝ๋ ์ดํฐ
def uppercase_decorator(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return result.upper()
return wrapper
class Greeting:
@uppercase_decorator
def say_hello(self):
return "hello, world"
g = Greeting()
print(g.say_hello()) # ์ถ๋ ฅ: HELLO, WORLD
- ์ ์ ๋ฉ์๋ ๋ฐ์ฝ๋ ์ดํฐ
class Math:
@staticmethod
@log_decorator
def add(a, b):
return a + b
Math.add(5, 7)
# ์ถ๋ ฅ:
# Calling function: add with arguments (5, 7) and {}
# Function add returned 12
7. ๋ฐ์ฝ๋ ์ดํฐ ์ฒด์ด๋
- ์ฌ๋ฌ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋์์ ์ฌ์ฉํ ์ ์์
- ์์์ ์๋๋ก ์์ฐจ์ ์ผ๋ก ์ ์ฉ๋จ
def decorator1(func):
def wrapper(*args, **kwargs):
print("Decorator 1")
return func(*args, **kwargs)
return wrapper
def decorator2(func):
def wrapper(*args, **kwargs):
print("Decorator 2")
return func(*args, **kwargs)
return wrapper
@decorator1
@decorator2
def my_function():
print("Original function")
my_function()
# ์ถ๋ ฅ:
# Decorator 1
# Decorator 2
# Original functionโ
์ ๋ฆฌ ๐งน
- ๋ฐ์ฝ๋ ์ดํฐ๋ ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์๋ฅผ ๋์ฌ์ฃผ๋ ์ญํ ์ ํ๋ค~
- ์ฌ์ฉ ์์:
- ๋ก๊น , ๊ถํ ๊ฒ์ฆ, ์คํ ์๊ฐ ์ธก์ , ๋ฐ์ดํฐ ๊ฒ์ฆ ๋ฑ•••
- ํจ์์ ํด๋์ค์ ๋ชจ๋ ์ ์ฉ ๊ฐ๋ฅํ๋ฉฐ ๋ค์ํ ์ ํธ๋ฆฌํฐ ํจ์๋ฅผ ๊ตฌํํ ๋ ์ ์ฉํ๋ค~
'AI ๐ค > Python ๐ป' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[250106] ์ฌ๊ทํจ์ ์ ๋ฆฌ (0) | 2025.01.06 |
---|---|
[250106] count() ์ Counter() ์ ์ฐจ์ด์ (0) | 2025.01.06 |
[250102] instance method, class method, static method์ ํน์ง๊ณผ ์ฐจ์ด์ (1) | 2025.01.02 |
[241227] sqrt() ์ pow() ๊ฐ๋ ์ ๋ฆฌ (2) | 2024.12.27 |
[241224] map() ๊ณผ lambda ํจ์ (0) | 2024.12.24 |