Bagaimanakah Saya Boleh Mengikat Kaedah Tidak Terikat dalam Python Tanpa Mencetuskan Invokasi?

Mary-Kate Olsen
Lepaskan: 2024-11-02 11:26:02
asal
807 orang telah melayarinya

How Can I Bind Unbound Methods in Python Without Triggering Invocation?

Mengikat Kaedah Tidak Terikat Tanpa Invocation

Dalam Python, mentakrifkan senarai peringkat kelas bagi tupel di mana setiap tupel mewakili butang dan pengendali acara yang sepadan boleh meningkatkan organisasi data. Walau bagaimanapun, mengikat kaedah tidak terikat kepada kejadian tanpa mencetuskan pelaksanaannya boleh menimbulkan cabaran.

Isu timbul apabila nilai pengendali acara adalah kaedah tidak terikat, yang membawa kepada ralat masa jalan. Walaupun functools.partial menawarkan penyelesaian, pendekatan yang lebih Pythonic ialah mengeksploitasi gelagat deskriptor bagi fungsi.

Deskriptor, termasuk fungsi, mempunyai kaedah __get__ yang, apabila dipanggil, mengikat fungsi kepada tika. Menggunakan kaedah ini, kita boleh mengikat kaedah tidak terikat seperti berikut:

<code class="python">bound_handler = handler.__get__(self, MyWidget)</code>
Salin selepas log masuk

Teknik ini secara berkesan mengikat pengendali kaedah tidak terikat kepada contoh MyWidget tanpa memanggilnya.

Sebagai alternatif, fungsi boleh guna semula boleh merangkum logik mengikat ini:

<code class="python">def bind(instance, func, as_name=None):
    """
    Bind the function *func* to *instance*, with either provided name *as_name*
    or the existing name of *func*. The provided *func* should accept the 
    instance as the first argument, i.e. "self".
    """
    if as_name is None:
        as_name = func.__name__
    bound_method = func.__get__(instance, instance.__class__)
    setattr(instance, as_name, bound_method)
    return bound_method</code>
Salin selepas log masuk

Fungsi ini membenarkan pengikatan fleksibel dengan tersuai nama:

<code class="python">something = Thing(21)

def double(self):
    return 2 * self.val

bind(something, double)
something.double()  # returns 42</code>
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengikat Kaedah Tidak Terikat dalam Python Tanpa Mencetuskan Invokasi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan