pythonアクセサリーの使い方

4981 ワード

pythonアクセラレータは、繰り返し実行するコードに対して、繰り返し実行する方法がどれだけあるか分からない場合に、タスクを大幅に簡素化するのに便利です.
メソッド実行の前置条件で、権限などのメソッドが実行されるかどうかを判断できます.
# -*- coding: utf-8 -*-
def w1(func):
    def inner():
        print("---      ---")
        if True:
            print("--   --")
        else:
            print("--   --")
        func()
    return inner

# @w1     f1 = w1(f1)
@w1
def f1():
    print("---f1---")

@w1
def f2():
    print("---f2---")


f1()
f2()


印刷結果は次のとおりです.
---      ---
--   --
---f1---
---      ---
--   --
---f2---

複数のデコレーションがある場合は、一番上のデコレーションから、その下のデコレーションとメソッドを一体として実行します
# -*- coding: utf-8 -*-

def zhuangShi1(func):
    def inner():
        print("---1---")
        return "     ---" + func()
    return inner

def zhuangShi2(func):
    def inner():
        print("---2---")
        return "     ---" + func()
    return inner

@zhuangShi1
@zhuangShi2
def f1():
    return "    "

res = f1()
print(res)


印刷結果は次のとおりです.
---1---
---2---
     ---     ---    

なお、2層の装飾器があり、装飾器の装飾時に実行コードがある場合は、装飾時に先に中から外へ行く.運転するときは、まず外載運転中を運転する.身分証明書がメールに包まれていると想像できますが、小包の場合は、まず身分証明書を見て、最後に外層小包に住所情報を書きます.小包を手に入れる時、まず小包の上の住所の情報を見て、分解してから身分の情報を見ることができます
# -*- coding: utf-8 -*-

def zhuangShi1(func):
    print("    1")  #         
    def inner():
        print("---1---")  #       
        return "     ---" + func()
    return inner
          
def zhuangShi2(func):
    print("    2")  #       
    def inner():   
        print("---2---")  #       
        return "     ---" + func()
    return inner
          
@zhuangShi1        
@zhuangShi2        
def f1():          
    return "    "
                   
res = f1()         
print(res)         


出力結果は次のとおりです.
    2
    1
---1---
---2---
     ---     ---    

パラメータ付きの装飾では,装飾器メソッドの閉パケットにパラメータを加え,閉パケットでメソッドを呼び出すときにパラメータを加えるだけでよい.
def zhuangShi(func):
    print("---         ---")
    def inner(*args, **kwargs): #       
        print("---inner---")
        func(*args, **kwargs) #       
    return inner

@zhuangShi
def func1(a, b, c):
    print("a = %d, b = %d, c = %d"%(a, b, c))

@zhuangShi
def func2(a, b, e):
    print("a = %d, b = %d, e = %d"%(a, b, e))


func1(1,2,3)
func2(11,22,e=33)


出力結果は次のとおりです.
---         ---
---         ---
---inner---
a = 1, b = 2, c = 3
---inner---
a = 11, b = 22, e = 33

関数に戻り値がある場合は、閉パケットに戻り値を保存し、最後に戻り値を返すだけです.
def zhuangShi(func):
    print("---         ---")
    def inner(*args, **kwargs):
        print("---inner---")
        res = func(*args, **kwargs)  #                
        return res  #         
    return inner

@zhuangShi
def func1(a, b, c):
    print("a = %d, b = %d, c = %d"%(a, b, c))
    return "hahaha"


res = func1(1,2,3)
print("res is %s"%res)


出力結果:
---         ---
---inner---
a = 1, b = 2, c = 3
res is hahaha

汎用装飾器は、戻り値の有無、パラメータの有無に適しています.
#      
def zhuangShi(func):
    def inner(*args, **kwargs):
        print("     ---    ")
        res = func(*args, **kwargs)
        return res
    return inner

@zhuangShi
def test1():
    print("-----test1-----     ")
    return "test   "

@zhuangShi
def test2():
    print("-----test2-----      ")

@zhuangShi
def test3(a):
    print("-----test3-----    ,  a = %d"%a)


res = test1()
print("test1      : %s"%res)
test2()
test3(45)


出力結果:
     ---    
-----test1-----     
test1      : test   
     ---    
-----test2-----      
     ---    
-----test3-----    ,  a = 45

パラメータ付き装飾器では、通常の装飾方法の外に関数を包む必要があります.
def zhuangShi(arg):  #               
    def zhuangShi_in(func):  #      
        def inner():
            print("--        --%s"%arg)
            func()
        return inner
    return zhuangShi_in  #           

@zhuangShi("--     --")
def test():
    print("test")

test()

出力結果
--        ----     --
test

クラスアクセラレータは、クラスを関数として使用するアクセラレータで、クラスのcall()メソッドを使用します.このメソッドでは、クラスが関数のようにクラス名でcallメソッドを直接呼び出すことができます.
class Test(object):
    def __init__(self, func):
        print("--       --")
        print("        : %s"%func.__name__)
        self.__func = func

    #__call__                   
    def __call__(self):
        print("--       --")
        self.__func()

@Test   #       test = Test(test)
def test():
    print("-------test  ---------")


test()

出力結果は次のとおりです.
--       --
        : test
--       --
-------test  ---------