>  기사  >  백엔드 개발  >  Python에서 바인딩되지 않은 메서드를 호출하지 않고 바인딩하는 방법은 무엇입니까?

Python에서 바인딩되지 않은 메서드를 호출하지 않고 바인딩하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-30 01:22:03546검색

How to Bind Unbound Methods in Python Without Invoking Them?

Gordian Knot 바인딩 해제: 바인딩되지 않은 메서드를 원활하게 바인딩

Python에서 바인딩되지 않은 메서드를 호출하지 않고 바인딩하면 코딩 문제가 발생할 수 있습니다. 다음 시나리오를 고려해보세요.

<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>

여기서 핸들러는 바인딩되지 않은 메서드를 나타내며 런타임 오류가 발생합니다. functools.partial은 해결 방법을 제공하지만 Python의 기본 설명자 기능은 우아한 솔루션을 제공합니다.

설명자의 힘 공개

Python의 모든 함수에는 고유한 설명자 속성이 있습니다. __get__ 메서드를 활용하면 바인딩 해제된 메서드를 인스턴스에 바인딩할 수 있습니다.

<code class="python">bound_handler = handler.__get__(self, MyWidget)</code>

이 기술을 사용하면 실행을 트리거하지 않고 바인딩 해제된 메서드를 바인딩할 수 있습니다.

포괄적인 예

설명을 위해 사용자 정의 바인드 기능을 구현해 보겠습니다.

<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>

이 바인드 기능을 활용하면 원하는 기능을 얻을 수 있습니다.

<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>

설명자의 힘으로 우리는 바인딩되지 않은 메소드를 손쉽게 바인딩하여 Python 원칙을 손상시키지 않으면서 수많은 코딩 가능성을 열어줍니다.

위 내용은 Python에서 바인딩되지 않은 메서드를 호출하지 않고 바인딩하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.