Ikat Kaedah Tidak Terikat Secara Dinamik
Dalam Python, kita sering menghadapi situasi di mana kita perlu mengikat kaedah tidak terikat pada contoh tanpa menggunakannya. Ini boleh menjadi teknik yang berharga dalam pelbagai senario, seperti mencipta GUI dinamik atau mengendalikan acara secara berstruktur.
Masalah Program Meletup
Pertimbangkan kod berikut coretan:
<code class="python">class MyWidget(wx.Window): buttons = [ ("OK", OnOK), ("Cancel", OnCancel) ] def setup(self): for text, handler in MyWidget.buttons: b = wx.Button(parent, label=text).bind(wx.EVT_BUTTON, handler)</code>
Isu di sini ialah pengendali mewakili kaedah tidak terikat, menyebabkan program ranap dengan ralat. Untuk menyelesaikan masalah ini, kami memerlukan cara untuk mengikat kaedah tidak terikat ini kepada contoh khusus MyWidget.
Kuasa Deskriptor
Kaedah Python juga merupakan deskriptor, yang menyediakan satu cara untuk mengikat mereka secara dinamik. Dengan memanggil kaedah __get__ khas pada kaedah tidak terikat, kita boleh mendapatkan kaedah terikat:
<code class="python">bound_handler = handler.__get__(self, MyWidget)</code>
Dengan memberikan kaedah terikat kepada atribut peringkat kelas, kita boleh mengikatnya dengan contoh dengan berkesan:
<code class="python">setattr(self, handler.__name__, bound_handler)</code>
Fungsi Ikatan Boleh Guna Semula
Dengan menggunakan teknik ini, kita boleh mencipta fungsi boleh guna semula untuk mengikat kaedah tidak terikat:
<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>
Dengan fungsi ini , kita kini boleh mengikat kaedah tidak terikat seperti berikut:
<code class="python">bind(something, double) something.double() # returns 42</code>
Atas ialah kandungan terperinci Bagaimanakah Anda Boleh Mengikat Kaedah Tidak Terikat Secara Dinamik dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!