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!