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 클러치와 장식기 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기