python - Menggunakan __call__ untuk melaksanakan fungsi penghias
某草草
某草草 2017-06-28 09:24:02
0
1
805

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

某草草
某草草

membalas semua(1)
迷茫

Sebenarnya, ada sesuatu yang perlu diperhatikan apabila menggunakan penghias kelas dengan parameter dan tanpa parameter sebenarnya berbeza

Penghias kelas tanpa parameter

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.

Penghias kelas dengan parameter

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...

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!