pythonアクセサリー理解
7439 ワード
python装飾器 pythonアクセラレータは、元の関数機能を拡張するための関数です.この関数の特殊な点は、戻り値も関数であり、pythonアクセラレータを使用するメリットは、元の関数のコードを変更することなく、関数に新しい機能を追加することです. 装飾器記号「@」は文法糖に属しています.どういう意味ですか.つまり、私は@装飾器の文法要求に従って書くのではなく、一般的なpythonの文法要求に従って書くことができます.では@装飾器のフォーマットで書く目的は簡単に書くためです 例
もし私が関数を持っていたら、機能は2つの数の和を計算します.
機能を追加し、和を求めてから差を求める必要があります.ただし、元の関数は変更できません.次のことができます.
ここではsum関数をパラメータとしてdecorate関数に渡し,sum関数を装飾することに相当する戻り値をsumに再指向する.
この操作を簡略化するためにpythonは文法糖を提供する.このように書くことができます.
上の2つのコード機能は同じですが、@decorateはsum=decorate(sum)に相当します.
複数の装飾
複数のモディファイヤが同じ関数を修飾する場合は、まず関数に近いものを実行します.
上のコードフロー:
@dec 2、すなわちtest=two(test)を先に実行し、aaaを出力します.@dec 1、すなわちtest=one(test)を再実行し、1111を出力する.
この場合、関数testは、test=one(two(test))を実行することに相当します.
test()に実行すると、実行関数が外から内へ、出力されます.
リファレンス
https://blog.csdn.net/xiangxianghehe/article/details/77170585 https://www.cnblogs.com/songyue/p/5196809.html https://mp.weixin.qq.com/s/KpveR377KifKJ7_drWxFGg
もし私が関数を持っていたら、機能は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