Menyahikat Simpul Gordian: Mengikat Kaedah Tidak Terikat Dengan Lancar
Dalam Python, mengikat kaedah tidak terikat tanpa menggunakan kaedah tersebut boleh memberikan cabaran pengekodan. Pertimbangkan senario ini:
<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>
Di sini, pengendali mewakili kaedah tidak terikat, yang membawa kepada ralat masa jalan. Walaupun functools.partial menawarkan penyelesaian, keupayaan deskriptor semula jadi Python menyediakan penyelesaian yang elegan.
Menyingkap Kuasa Deskriptor
Semua fungsi dalam Python mempunyai sifat deskriptor intrinsik. Dengan memanfaatkan kaedah __get__ mereka, kaedah tidak terikat boleh terikat kepada contoh:
<code class="python">bound_handler = handler.__get__(self, MyWidget)</code>
Teknik ini membolehkan pengikatan kaedah tidak terikat tanpa mencetuskan pelaksanaannya.
Contoh Komprehensif
Untuk menggambarkan, mari kita laksanakan fungsi ikatan tersuai:
<code class="python">def bind(instance, func, as_name=None): 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>
Menggunakan fungsi ikatan ini, kita boleh mencapai kefungsian yang diingini:
<code class="python">class Thing: def __init__(self, val): self.val = val something = Thing(21) def double(self): return 2 * self.val bind(something, double) something.double() # returns 42</code>
Dengan memeluk kuasa deskriptor, kami dengan mudah mengikat kaedah tidak terikat, membuka kunci pelbagai kemungkinan pengekodan tanpa menjejaskan prinsip Pythonic.
Atas ialah kandungan terperinci Bagaimana untuk Mengikat Kaedah Tidak Terikat dalam Python Tanpa Menggunakannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!