のPythonのデコレータの深い理解

1、クローズドの原則を開きます。

(1)オープンコード拡張

デザインで始まる任意のプログラムは、すべての機能および任意の将来のアップデートや修正なしで考えていませんでした。だから我々は、新しい機能を追加し、コード拡張を許可する必要があります。

(2)ソースコードが閉じられた変更

今回は我々が呼ばれる内部関数を変更したり、機能を変更した場合、使用することを他の人に配信された関数を記述すると、すでに機能を使用して他のユーザーに影響を与える可能性があります。

ソースコードと通話モードを変更せずに、機能が追加オープンクローズドの原則を追加することです

2、デコレータ:

本来の機能を変更することなく、装飾的なだけでなく、ソースコードが追加機能を追加するために、呼ばれています。

(1)最初のデコレータに会いました:

デコレーション(追加機能)(ツール:機能)

import time

def index():
    time.sleep(2)  #
    print("这是小明写的功能")

def func():
    time.sleep(1)  #
    print("这是小刚写的功能")

def red():
    time.sleep(2)  #
    print("这是小红写的功能")

start_time = time.time()  # 时间戳
index()
print(time.time() - start_time)

start_time = time.time()  # 时间戳
func()
print(time.time() - start_time)

start_time = time.time()  # 时间戳
red()
print(time.time() - start_time)

(1970年1月1日に0:00:00時点からこの時点で秒数でも、タイムスタンプと呼ばれるこの方法は、GMTを返し、それが変更されています。)

import time
print(time.time())

上記のコードを繰り返し、退屈

シーク時間が改善:(関数で記述されている、関数は、関数指向である、)コードの重複を減らします

import time

def index():
    time.sleep(2)  #
    print("这是小明写的功能")

def func():
    time.sleep(1)  #
    print("这是小刚写的功能")

def red():
    time.sleep(2)  #
    print("这是小红写的功能")

def times(func):
    start_time = time.time()  # 时间戳
    func()
    print(time.time() - start_time)

times(index)
times(func)

改良:

第一版装饰器
import time
def func():
    time.sleep(1)  #
    print("这是小刚写的功能")

def red():
    time.sleep(2)  #
    print("这是小红写的功能")

def index():
    time.sleep(2)  #
    print("这是小明写的功能")

def times(func):
    def foo():
        start_time = time.time()  # 时间戳  被装饰函数执行前干的事
        func()
        print(time.time() - start_time) #   被装饰函数执行后干的事
    return foo           # 不能加括号

index = times(index)       # 不能加括号
index()
func = times(func)
func()

(2)シンタックスシュガーは(私たちはことを行うに役立ちます)

装飾的な機能の上に書かれたシンタックスシュガーに
def warpper(f):
    def inner():
        print("111")
        f()
        print("222")
    return inner

# python帮咱们做的一个东西,语法糖
@warpper  # func = warpper(func)
def func():
    print("被装饰的函数1")

@warpper  # index = warpper(index)
def index():
    print("被装饰的函数2")

func()
def warpper(f):
    def inner(*args,**kwargs):
        print("被装饰函数执行前")
        ret = f(*args,**kwargs)
        print("被装饰函数执行后")
        return ret
    return inner

@warpper
def func(*args,**kwargs):
    print(f"被装饰的{args,kwargs}")
    return "我是func函数"

@warpper
def index(*args,**kwargs):
    print(11111)

print(func(1,2,3,4,5,6,7,8,a=1))

(3)のStandard Editionデコレータ。

def wrapper(func):
    def inner(*args,**kwargs):
        '''执行被装饰函数之前的操作'''
        ret = func()
        '''执行被装饰函数之后的操作'''
        return ret
    return inner

これは、コードのオープンクローズの原則に完全に準拠し、標準のデコレータです。

4、デコレータアドバンスト

(1)基準デコレータ

def auth(argv):
    def warpper(func):
        def inner(*args,**kwargs):
            if argv == "博客园":
                print("欢迎登录博客园")
                user = input("user:")
                pwd = input("pwd:")
                if user == 'alex' and pwd == "dsb":
                    func(*args,**kwargs)
            elif argv == "码云":
                print("欢迎登录码云")
                user = input("user:")
                pwd = input("pwd:")
                if user == 'alex' and pwd == "jsdsb":
                    func(*args, **kwargs)

        return inner
    return warpper

def foo():
    print("被装饰的函数")

msg = input("请输入您要登录的名字:")
a = auth(msg)
foo = a(foo)
foo()
def auth(argv):
    def wrapper(func):
        def inner(*args,**kwargs):
            if argv:
                print("我加上功能了!")
                func(*args,**kwargs)
            else:
                func(*args,**kwargs)
        return inner
    return wrapper

https://www.cnblogs.com/

@auth(True)   # @auth == foo = wrapper(foo) = auth(True)   flask框架
def foo():
    print("这是一个点燃")
foo()

装飾関数デコレータの(2)複数の

デコレータ装飾機能、複数の最寄りデコレータから装飾される関数を実行します

def auth(func):             # wrapper1装饰器里的 inner
    def inner(*args,**kwargs):
        print("额外增加了一道 锅包肉")
        func(*args,**kwargs)
        print("锅包肉 38元")
    return inner

def wrapper1(func):        # warpper2装饰器里的 inner
    def inner(*args,**kwargs):
        print("额外增加了一道 刺生")
        func(*args,**kwargs)
        print("刺生 白吃")
    return inner

def wrapper2(func):         # 被装饰的函数foo
    def inner(*args,**kwargs):
        print("额外增加了一道 麻辣哥")
        func(*args,**kwargs)
        print("难以下嘴")
    return inner
    
def foo(): 
    print("这是一个元宝虾饭店")
    
foo = wrapper2(foo) # inner = wrapper2(foo)
foo = wrapper1(foo) # inner = wrapper1(inner)
foo = auth(foo)     # inner = auth(inner)
foo()               # auth里边的inner()
def auth(func):            # wrapper1装饰器里的 inner
    def inner(*args,**kwargs):
        print(123)
        func(*args,**kwargs)
        print(321)
    return inner


def wrapper1(func):         # warpper2装饰器里的 inner
    def inner(*args,**kwargs):
        print(111)
        func(*args,**kwargs)
    return inner


def wrapper2(func):          # 被装饰的函数foo
    def inner(*args,**kwargs):
        print(222)
        func(*args,**kwargs)
        print(567)
    return inner


@auth                 # 1           7
@wrapper1             #   2       6
@wrapper2             #    3    5
def foo():            #      4
    print("www.baidu.com")
foo()

おすすめ

転載: www.linuxidc.com/Linux/2019-09/160551.htm