Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah Saya Boleh Mengikat Kaedah Tidak Terikat dalam Python Tanpa Mencetuskan Invokasi?

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

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-02 11:26:02718semak imbas

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>

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>

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>

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!

Kenyataan:
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