pythonアクセサリーの使い方
4981 ワード
pythonアクセラレータは、繰り返し実行するコードに対して、繰り返し実行する方法がどれだけあるか分からない場合に、タスクを大幅に簡素化するのに便利です.
メソッド実行の前置条件で、権限などのメソッドが実行されるかどうかを判断できます.
印刷結果は次のとおりです.
複数のデコレーションがある場合は、一番上のデコレーションから、その下のデコレーションとメソッドを一体として実行します
印刷結果は次のとおりです.
なお、2層の装飾器があり、装飾器の装飾時に実行コードがある場合は、装飾時に先に中から外へ行く.運転するときは、まず外載運転中を運転する.身分証明書がメールに包まれていると想像できますが、小包の場合は、まず身分証明書を見て、最後に外層小包に住所情報を書きます.小包を手に入れる時、まず小包の上の住所の情報を見て、分解してから身分の情報を見ることができます
出力結果は次のとおりです.
パラメータ付きの装飾では,装飾器メソッドの閉パケットにパラメータを加え,閉パケットでメソッドを呼び出すときにパラメータを加えるだけでよい.
出力結果は次のとおりです.
関数に戻り値がある場合は、閉パケットに戻り値を保存し、最後に戻り値を返すだけです.
出力結果:
汎用装飾器は、戻り値の有無、パラメータの有無に適しています.
出力結果:
パラメータ付き装飾器では、通常の装飾方法の外に関数を包む必要があります.
出力結果
クラスアクセラレータは、クラスを関数として使用するアクセラレータで、クラスのcall()メソッドを使用します.このメソッドでは、クラスが関数のようにクラス名でcallメソッドを直接呼び出すことができます.
出力結果は次のとおりです.
メソッド実行の前置条件で、権限などのメソッドが実行されるかどうかを判断できます.
# -*- 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 ---------