python 고급 문법의 클러치와 장식기 상세 설명
1. 패키지 닫기
패키지를 닫는 조건:
1. 함수 중첩.
2. 내부 함수는 외부 함수의 변수나 매개변수를 사용합니다.
3. 외부 함수는 외부 변수를 사용하는 내부 함수를 되돌려줍니다.
간단한 예
def func_out(num1):
def inner(num2):
res = num1 + num2
print(res)
return inner
# a = func_out(10)(10)
a = func_out(10)
a(10)
패키지를 닫고 외부 함수의 변수를 수정하려면 다음과 같이 하십시오.패키지에서 외부 함수를 수정하려면 nonlocal 키워드를 사용해야 합니다
def func_out():
#
num1 = 10
def func_inner():
#
nonlocal num1
num1 = 20
res = num1 +20
print(res)
print(" ", num1)
func_inner()
print(" ", num1)
return func_inner
new_func = func_out()
new_func()
3. 장식기
3.1 간단한 장식기
장식기는 기존 함수에 추가 기능을 추가하는 함수로 본질적으로 폐쇄 함수, 즉 함수 삽입이다.장식기의 기능 특징:
1. 기존 함수의 소스 코드를 수정하지 않음
2. 기존 함수의 호출 방식을 수정하지 않음
3. 기존 함수에 추가 기능 추가
사용자가 평론을 발표할 때 사용자의 로그인 여부를 검증해야 한다. 우리는 먼저 원래의 함수를 수정하고 함수에 기능을 추가하는 것을 생각할 것이다. 그러나 현재 이 분업 합작 시대에 이런 수정은 조상의 코드를 수정한 후에 함수에 문제가 생기고 코드의 효율적인 복용에 영향을 미치기 쉽다.원래의 평론 코드를 다시 수정하지 않고 높은 수준의 코드 복용을 실현하기 위해서다.
원래 함수와 호출:
def comment():
print(" .....")
print(" ")
#
comment()
직접 손으로 장식기 기능을 실현하는 함수 로그인 검증:
def decorator(func):
def inner():
print(' ...
')
func()
return inner
def comment():
print(" .....")
print(" ")
#
comment = decorator(comment)
comment()
입력 결과:로그인 인증 중...
검증 성공
조상 코드 실행...
논평을 발표하다
3.1.1 장식기를 사용한 문법당
장식기의 문법 설탕 쓰기: @ 장식기 이름
예를 들어 다음과 같이 바꿀 수 있습니다.
def decorator(func):
def inner():
print(' ...
')
func()
return inner
@decorator
def comment():
print(" .....")
print(" ")
#
comment()
실행 결과:로그인 인증 중...
검증 성공
조상 코드 실행...
논평을 발표하다
3.1.2 장식기의 실행 시기
결론: 장식기 문법 설탕을 사용할 때 이 장식기 함수를 먼저 실행합니다.
def decorator(func):
#
print('--remark1----')
def inner():
print(' ...
')
func()
print('----remark2---')
return inner
@decorator
def comment():
print(" .....")
print(" ")
출력 결과:Cremark1----
----remark2―
3.2 일반 장식기
장식의 함수는 매개 변수가 전달되거나 되돌아오는 값이 있을 수 있습니다. 위에 쓴 예에서 위의 방법과 역행 장식기의 장식에 문제가 생기면 일반적인 장식기가 임의의 함수를 장식할 수 있습니까?
3.2.1 장식에 파라미터가 있는 함수
def logging(fn):
def inner(num1,num2):
print(' ')
fn(num1,num2)
return inner
#
@logging
def sum_num(a,b):
result = a + b
print(result)
sum_num(1,2)
3.2.2. 반환 값이 있는 함수를 꾸미려면 다음과 같이 하십시오.
def logging(fn):
def inner(num1,num2):
print(' ')
result = fn(num1,num2)
return result
return inner
#
@logging
def sum_num(a,b):
result = a + b
return result
print(sum_num(1,2))
3.2.3 유니버설 장식기 구현
*args
: 메타그룹 매개 변수를 수신하는 데 사용되며, 전송할 수도 있고 안 할 수도 있습니다.**kwargs
: 사전 형식 매개 변수를 수신하는 데 사용되며, 전송할 수도 있고 안 할 수도 있습니다.
def logging(fn):
def inner(*args, **kwargs):
result = fn(*args, **kwargs)
return result
return inner
@logging
def sum_num(a,b):
result = a + b
return result
3.3 여러 개의 장식기 사용
여러 개의 장식기의 과정: 내부에서 외부로의 장식 과정, 내부 장식기를 먼저 실행하고 외부 장식기를 실행한다.
원리 분석: content = make_div(make_p(content))
단계별 해체: content = make_p(content), 내부 장식기 완성 content=make_p.inner, content = make_div(make_p.inner)
def make_div(func):
print("make_div ")
def inner():
#
result = "<div>" + func() +"</div>"
return result
return inner
def make_p(func):
print("make_p ")
def inner():
#
result = "<p>" + func() +"</p>"
return result
return inner
@make_div
@make_p
def content():
return " , Python"
출력:make_p 장식기가 실행되었습니다.
make_div 장식기가 실행되었습니다.
<div><p> , Python</p></div>
3.4 파라미터가 있는 장식기
파라미터가 있는 장식기는 시기적으로 함수를 정의하여 함수가 파라미터를 수신하고 함수 내부에서 이 장식기로 되돌아오도록 한다.
가감을 판단할 수 있는 장식기를 정의하는 경우:
def return_decorator(flag):
def decorator(func):
def inner(a,b):
if flag == '+':
print(" ")
elif flag == '-':
print(" ")
func(a,b)
return inner
return decorator
@return_decorator('+')
def add_num(a,b):
print(a+b)
add_num(1,5)
3.5 종류 장식기
클래스 장식을 사용하면 함수가 있습니다.
class MyDecorator(object):
def __init__(self,func):
self.__func = func
# __call__ , ,
# 。
def __call__(self,*args,**kwargs):
#
print('-- -----')
self.__func()
@MyDecorator
def show():
print("hello")
# MyDecorator --> show()==> ()
show()
출력:C 장식 중-----
hello
이python 고급 문법의 클러치와 장식기에 대한 상세한 설명은 여기까지입니다. 더 많은 관련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에 따라 라이센스가 부여됩니다.