파 이 썬 진급 장식 기
Python 장식 기 를 이해 하려 면 먼저 Python 에서 함수 도 하나의 대상 이라는 것 을 알 아야 하기 때문에 함 수 를 정의 할 때의 함수 명 을 함수 대상 의 인용 으로 볼 수 있 습 니 다.인용 이 므 로 함 수 를 변수 에 할당 할 수도 있 고 함 수 를 매개 변수 로 전달 하거나 되 돌려 줄 수도 있 습 니 다.동시에 함수 체 에서 도 함 수 를 다시 정의 할 수 있다.
장식 기 본질
단순 함수 의 예 를 만들어 장식 기 가 해 야 할 일 을 복원 할 수 있 습 니 다.
def decorator(func):
def wrap():
print("Doing someting before executing func()")
func()
print("Doing someting after executing func()")
return wrap
def fun_test():
print("func")
fun_test = decorator(fun_test)
fun_test()
# Output:
# Doing someting before executing func()
# func
# Doing someting after executing func()
fun_test 가 가리 키 는 함수 의 인용 은 decorator()함수 에 전 달 됩 니 다.decorator()함수 에서 wrap()자 함 수 를 정의 합 니 다.이 자 함 수 는 func 참조 로 전 달 된 fun 을 호출 합 니 다.test()함수,호출 함수 전후 에 다른 일 을 했 습 니 다.
decorator()함수 가 내부 에서 정 의 된 wrap()함수 인용 을 되 돌려 줍 니 다.
fun_test 는 decorator()가 되 돌아 오 는 함수 인용 을 받 아 새로운 함수 대상 을 가리 키 고 있 습 니 다.
통과 funtest()는 새로운 함 수 를 호출 하여 wrap()함수 의 기능 을 수행 하여 funtest()함수 의 앞 뒤 장식
Python 에서 장식 기 사용 하기
Python 에 서 는@기 호 를 통 해 장식 기 기능 을 편리 하 게 사용 할 수 있 습 니 다.
def decorator(func):
def wrap():
print("Doing someting before executing func()")
func()
print("Doing someting after executing func()")
return wrap
@decorator
def fun_test():
print("func")
fun_test()
# Output:
# Doing someting before executing func()
# func
# Doing someting after executing func()
장식의 기능 은 이미 실현 되 었 으 나,이때 실행:
print(fun_test.__name__)
# Output:
# wrap
fun_test.__name__wrap 이 되 었 습 니 다.이것 은 wrap()함수 가 우리 함수 의 이름과 주석 문 서 를 다시 썼 습 니 다.이 문 제 는 funtools.wraps 를 통 해 해결 할 수 있 습 니 다.wraps 는 함수 하 나 를 받 아들 여 장식 하고 함수 이름 복사,주석 문서,매개 변수 목록 등 기능 을 추가 합 니 다.이것 은 장식 기 안에서 장식 전의 함수 속성 에 접근 할 수 있 습 니 다.보다 규범 화 된 표기 법:
from functools import wraps
def decorator(func):
@wraps(func)
def wrap():
print("Doing someting before executing func()")
func()
print("Doing someting after executing func()")
return wrap
@decorator
def fun_test():
print("func")
fun_test()
print(fun_test.__name__)
# Output:
# Doing someting before executing func()
# func
# Doing someting after executing func()
# fun_test
매개 변수 장식 기패키지 함수 의 함 수 를 되 돌려 줍 니 다.wraps 장식 기 를 모방 하여 매개 변수 가 있 는 장식 기 를 만 들 수 있 습 니 다.
from functools import wraps
def loginfo(info='info1'):
def loginfo_decorator(func):
@wraps(func)
def wrap_func(*args, **kwargs):
print(func.__name__ + ' was called')
print('info: %s' % info)
return func(*args, **kwargs)
return wrap_func
return loginfo_decorator
@loginfo()
def func1():
pass
func1()
# Output:
# func1 was called
# info: info1
@loginfo(info='info2')
def func2():
pass
func2()
# Output:
# func2 was called
# info: info2
장식 류클래스 를 작성 하 는 방법 을 통 해 장식 기 를 실현 할 수 있 고 장식 기 가 계승 등 대상 을 대상 으로 더욱 실 용적 인 특성 을 가지 게 할 수 있다.
먼저 장식 기 기본 클래스 를 만 듭 니 다:
from functools import wraps
class loginfo:
def __init__(self, info='info1'):
self.info = info
def __call__(self, func):
@wrap
def wrap_func(*args, **kwargs):
print(func.__name__ + ' was called')
print('info: %s' % self.info)
self.after() # after ,
return func(*args, **kwargs)
return wrap_func
def after(self):
pass
@loginfo(info='info2')
def func1():
pass
# Output:
# func1 was called
# info: info1
loginfo 클래스 를 계승 하여 장식 기의 기능 을 확장 합 니 다:
class loginfo_after(loginfo):
def __init__(self, info2='info2', *args, **kwargs):
self.info2 = info2
super(loginfo_after, self).__init__(*args, **kwargs)
def after(self):
print('after: %s' % self.info2)
@loginfo_after()
def func2():
pass
func2()
# Output:
# func2 was called
# info: info1
# after: info2
이상 의 이 상투적인 Python 진급 장식 기 는 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 에 게 참고 가 되 고 많은 응원 을 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.