Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Mengikat Kaedah Tidak Terikat dalam Python Tanpa Menggunakannya?

Bagaimana untuk Mengikat Kaedah Tidak Terikat dalam Python Tanpa Menggunakannya?

Barbara Streisand
Barbara Streisandasal
2024-10-30 01:22:03633semak imbas

How to Bind Unbound Methods in Python Without Invoking Them?

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!

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