Bagaimanakah Anda Boleh Mengikat Kaedah Tidak Terikat Secara Dinamik dalam Python?

Barbara Streisand
Lepaskan: 2024-10-30 14:21:03
asal
609 orang telah melayarinya

How Can You Dynamically Bind Unbound Methods in Python?

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

Dengan fungsi ini , kita kini boleh mengikat kaedah tidak terikat seperti berikut:

<code class="python">bind(something, double)
something.double()  # returns 42</code>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan