Rumah > Soal Jawab > teks badan
Gunakan __panggilan__ kelas untuk melaksanakan penghias, seperti yang ditunjukkan dalam kod berikut
class Check(object):
def __init__(self, name):
self.name = name
def __call__(self, func):
print "1111111111"
def _decorator(*args, **kwargs):
print "2222222222"
return func(*args, **kwargs)
Jika anda menggunakan kelas ini sebagai penghias untuk menghias sesuatu majlis.
@Check("param")
def param_check(request):
"python code....."
return Response("ok")
Inilah masalahnya. Mulakan django atau sebarang proses python lain. Apabila melaksanakan laluan param_check ini, cetak "1111111111" hanya dicetak buat kali pertama dan 1111111111111 tidak dicetak apabila dipanggil kemudian.
Dan cetak "2222222222" dicetak setiap kali. Pemahaman saya ialah __call__ mentakrifkan penghias ini untuk kali pertama, jadi ia hanya dilaksanakan sekali sahaja apabila diminta semula kemudian, dan hanya bahagian badan fungsi yang dilaksanakan, iaitu bahagian cetakan 222222222. Siapa tahu ciri-ciri penghias ular sawa ini
迷茫2017-06-28 09:26:02
Sebenarnya, ada sesuatu yang perlu diperhatikan apabila menggunakan penghias kelas dengan parameter dan tanpa parameter sebenarnya berbeza
Jika anda mencipta penghias tanpa parameter, kaedah yang dihias akan dihantar kepada pembina penghias (__init__), dan kemudian apabila fungsi yang dihias dipanggil, kaedah __call__() penghias akan dilaksanakan.
class Check(object):
def __init__(self, func):
self.func = func
def __call__(self, *args):
print("111111")
self.func(*args)
print("222222")
@Check
def param_check(request):
print(request)
param_check('hello')
param_check('world')
111111
hello
222222
111111
world
222222
Perlu diambil perhatian bahawa semasa fasa hiasan, fungsi __init__ dilaksanakan, dan apabila kaedah berhias dipanggil, __call__ dilaksanakan.
class Check(object):
def __init__(self, name):
self.name = name
def __call__(self, func):
print ("1111111111")
def decorator(*args, **kwargs):
print ("2222222222")
return func(*args, **kwargs)
return decorator
@Check('parm')
def param_check():
print('Hello')
param_check()
param_check()
Keluaran:
1111111111
2222222222
Hello
2222222222
Hello
Dapat dilihat dengan jelas bahawa __call__ hanya akan dipanggil sekali semasa fasa hiasan
Jika anda ingin mengetahui butiran lanjut, sila lihat di sini: http://www.artima.com/weblogs...