[ ๋ฐ์ฝ๋ ์ดํฐ / Python ] ๋ฐ์ฝ๋ ์ดํฐ๋ ์ ์ฌ์ฉํ๊ณ , ์ด๋ป๊ฒ ์ฌ์ฉํด์ผํ ๊น
1. ๋ฐ์ฝ๋ ์ดํฐ์ ๊ธฐ๋ณธ ๊ฐ๋
๋ฐ์ฝ๋ ์ดํฐ๋ ํ๋์ ํจ์๋ฅผ ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ์ ๋ฌํ์ฌ, ์๋ณธ ํจ์์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฑฐ๋ ์์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. Python์์ ๋ฐ์ฝ๋ ์ดํฐ๋ @ ๊ธฐํธ์ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค.
@๋ฐ์ฝ๋ ์ดํฐ
def ํจ์์ด๋ฆ():
pass
์ ๊ตฌ๋ฌธ์ ํจ์์ด๋ฆ = ๋ฐ์ฝ๋ ์ดํฐ(ํจ์์ด๋ฆ)๊ณผ ๋์ผํ๊ฒ ๋์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ๋จ์ ๋ฐ์ฝ๋ ์ดํฐ๋ ์ด๋ค ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค ๊ทธ ํจ์์ ์ด๋ฆ์ ์ถ๋ ฅํฉ๋๋ค.
def simple_decorator(func):
def wrapper():
print(f"Calling function: {func.__name__}")
func()
return wrapper
@simple_decorator
def say_hello():
print("Hello!")
say_hello()
# ์ถ๋ ฅ:
# Calling function: say_hello
# Hello!
์ฆ ๋ฐ์ฝ๋ ์ดํฐ๋ ํจ์์์์ ํจ์๋ฅผ ์ ์ฐํ๊ฒ ํธ์ถํ๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค.
2. ๋ฐ์ฝ๋ ์ดํฐ์ ๋ด๋ถ ๋์ ์๋ฆฌ
๋ฐ์ฝ๋ ์ดํฐ๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค.
1. func ํ๋ผ๋ฏธํฐ๋ก ํจ์๋ฅผ ๋ฐ์ต๋๋ค.
2. ํจ์ wrapper๋ ์๋ ํจ์์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ func()๋ฅผ ์คํํฉ๋๋ค.
3. ์ต์ข ์ ์ผ๋ก, wrapper ํจ์๋ฅผ ๋ฐํํ์ฌ ๋ฐ์ฝ๋ ์ดํฐ๋ ํจ์๋ฅผ ๊ฐ์ธ๊ฒ ํฉ๋๋ค.
์ด๋ก ์ธํด ํจ์ ํธ์ถ ์๋ง๋ค ์๋ก์ด ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ wrapper ํจ์๊ฐ ์คํ๋ฉ๋๋ค.
3. ๋ค์ํ ๋ฐ์ฝ๋ ์ดํฐ ์์
์์ 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"Execution time of {func.__name__}: {end_time - start_time:.4f} seconds")
return result
return wrapper
@timer_decorator
def slow_function():
time.sleep(2)
print("Function complete.")
slow_function()
# ์ถ๋ ฅ:
# Function complete.
# Execution time of slow_function: 2.0001 seconds
์์ 2: ํจ์์ ์ธ์ ์ ๋ฌํ๋ ๋ฐ์ฝ๋ ์ดํฐ
์ ๋ฐ์ฝ๋ ์ดํฐ๋ ํจ์์ ์ธ์๋ฅผ ์ ๋ฌํ๋ ๊ฒฝ์ฐ์๋ ์ฌ์ฉํ ์ ์๋๋ก *args์ **kwargs๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๊ถํ์ ํ์ธํ๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ง๋ค์ด ๋ด ์๋ค.
def check_permission(permission_required):
def decorator(func):
def wrapper(user_permission, *args, **kwargs):
if user_permission == permission_required:
return func(*args, **kwargs)
else:
print("Permission Denied")
return wrapper
return decorator
@check_permission("admin")
def delete_file():
print("File deleted.")
# ์์ ์คํ
delete_file("admin") # Permission granted
delete_file("guest") # Permission Denied
# ์ถ๋ ฅ:
# File deleted.
# Permission Denied
์์ 3: ์ฌ๋ฌ ๋ฐ์ฝ๋ ์ดํฐ ์ฌ์ฉํ๊ธฐ
์ฌ๋ฌ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ํ ํจ์์ ์ ์ฉํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ, ๋ฐ์ฝ๋ ์ดํฐ๋ ์์์ ์๋๋ก ์ฐจ๋ก๋ก ์ ์ฉ๋ฉ๋๋ค.
def make_upper(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return result.upper()
return wrapper
def print_stars(func):
def wrapper(*args, **kwargs):
print("*****")
result = func(*args, **kwargs)
print("*****")
return result
return wrapper
@print_stars
@make_upper
def greet():
return "hello"
print(greet())
# ์ถ๋ ฅ:
# *****
# HELLO
# *****
4. ํด๋์ค ๋ฉ์๋ ๋ฐ์ฝ๋ ์ดํฐ
ํด๋์ค ๋ฉ์๋์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค. ์๋ฅผ ๋ค์ด, staticmethod๋ classmethod๋ฅผ ๋ฐ์ฝ๋ ์ดํฐ๋ก ํ์ฉํ์ฌ ๋ฉ์๋๋ฅผ ์ ์ ๋๋ ํด๋์ค ๋ฉ์๋๋ก ๋ง๋ค ์ ์์ต๋๋ค
class MathOperations:
@staticmethod
def add(x, y):
return x + y
@classmethod
def multiply(cls, x, y):
return x * y
# ๋ฉ์๋ ํธ์ถ
print(MathOperations.add(5, 7)) # ์ถ๋ ฅ: 12
print(MathOperations.multiply(5, 7)) # ์ถ๋ ฅ: 35
๊ฒฐ๋ก : ๋ฐ์ฝ๋ ์ดํฐ์ ์ฅ๋จ์ ๊ณผ ํ์์ฑ
๋ฐ์ฝ๋ ์ดํฐ๊ฐ ํ์ํ ์ด์
๋ฐ์ฝ๋ ์ดํฐ๋ ๋ฐ๋ณต์ ์ธ ์์ ์ ์ฝ๋ ์์ ์์ด ์ถ๊ฐํ ์ ์๋ ์ ์ฐํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ก๊น , ๊ถํ ๊ด๋ฆฌ, ์ฑ๋ฅ ์ธก์ ๋ฑ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์ฌ๋ฌ ํจ์์ ์ฝ๊ฒ ์ ์ฉํ ์ ์์ต๋๋ค.
์ฅ์
- ์ฌ์ฌ์ฉ์ฑ: ๋์ผํ ๊ธฐ๋ฅ์ ์ฌ๋ฌ ํจ์์ ์ฝ๊ฒ ์ ์ฉํ ์ ์์ด ์ฝ๋ ์ฌ์ฌ์ฉ์ด ์ฉ์ดํฉ๋๋ค.
- ๊ฐ๋ ์ฑ: ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํ์ฌ ์ฝ๋์ ํต์ฌ ๋ก์ง๊ณผ ๋ถ๊ฐ ๊ธฐ๋ฅ(๋ก๊น ๋ฑ)์ ๋ช ํํ ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
- ์ ์ฐ์ฑ: ํจ์์ ๋์์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์์ด ํ ์คํธ ๋ฐ ์ ์ง๋ณด์์ ์ ๋ฆฌํฉ๋๋ค.
๋จ์
- ๋๋ฒ๊น ์ด๋ ค์: ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ์ฌ๋ฌ ๊ฐ ์ค์ฒฉ๋๋ฉด ํจ์์ ํธ์ถ ํ๋ฆ์ ์ถ์ ํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
- ๋ณต์ก์ฑ ์ฆ๊ฐ: ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด ์ฝ๋๊ฐ ๋ณต์กํด์ง๊ณ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง ์ ์์ต๋๋ค.
๋ฐ์ฝ๋ ์ดํฐ๋ Python์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ดํดํ๊ณ ์ฝ๋์ ๋ชจ๋ํ์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ์ด๋ฏ๋ก, ์ ์ ํ๊ฒ ์ฌ์ฉํ๋ฉด ์์ฐ์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.