cari

Rumah  >  Soal Jawab  >  teks badan

python - Menggunakan __call__ untuk melaksanakan fungsi penghias

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

某草草某草草2785 hari yang lalu896

membalas semua(1)saya akan balas

  • 迷茫

    迷茫2017-06-28 09:26:02

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

    balas
    0
  • Batalbalas