pythonアクセサリー理解


python装飾器
  • pythonアクセラレータは、元の関数機能を拡張するための関数です.この関数の特殊な点は、戻り値も関数であり、pythonアクセラレータを使用するメリットは、元の関数のコードを変更することなく、関数に新しい機能を追加することです.
  • 装飾器記号「@」は文法糖に属しています.どういう意味ですか.つまり、私は@装飾器の文法要求に従って書くのではなく、一般的なpythonの文法要求に従って書くことができます.では@装飾器のフォーマットで書く目的は簡単に書くためです

  • もし私が関数を持っていたら、機能は2つの数の和を計算します.
    def sum(a, b):
    	print(a + b)
    
    sum(2, 1)
    

    機能を追加し、和を求めてから差を求める必要があります.ただし、元の関数は変更できません.次のことができます.
    def sum(a, b):
    	print(a + b)
    
    def decorate(func):
    	def minus(a, b):
    		func(a, b)
    		print(a - b)
    	return minus
    
    sum = decorate(sum)
    
    sum(2, 1)
    

    ここではsum関数をパラメータとしてdecorate関数に渡し,sum関数を装飾することに相当する戻り値をsumに再指向する.
    この操作を簡略化するためにpythonは文法糖を提供する.このように書くことができます.
    def decorate(func):
    	def minus(a, b):
    		func(a, b)
    		print(a - b)
    	return minus
    	
    @decorate
    def sum(a, b):
    	print(a + b)
    
    sum(2, 1)
    

    上の2つのコード機能は同じですが、@decorateはsum=decorate(sum)に相当します.
    複数の装飾
    複数のモディファイヤが同じ関数を修飾する場合は、まず関数に近いものを実行します.
    def dec1(func):  
        print("1111")  
        def one():  
            print("2222")  
            func()  
            print("3333")  
        return one  
      
    def dec2(func):  
        print("aaaa")  
        def two():  
            print("bbbb")  
            func()  
            print("cccc")  
        return two  
     
    @dec1  
    @dec2  
    def test():  
        print("test test")  
      
    test()  
    
    #    :
    aaaa
    1111
    2222
    bbbb
    test test
    cccc
    3333
    
    

    上のコードフロー:
    @dec 2、すなわちtest=two(test)を先に実行し、aaaを出力します.@dec 1、すなわちtest=one(test)を再実行し、1111を出力する.
    この場合、関数testは、test=one(two(test))を実行することに相当します.
    test()に実行すると、実行関数が外から内へ、出力されます.
    2222		// one()
    bbbb		// two()
    test test	//test()
    cccc		// two()
    3333		// one()
    

    リファレンス
    https://blog.csdn.net/xiangxianghehe/article/details/77170585 https://www.cnblogs.com/songyue/p/5196809.html https://mp.weixin.qq.com/s/KpveR377KifKJ7_drWxFGg