찾다

 >  Q&A  >  본문

python3.x - Python 如何通过类方法创建实例方法?

下面是 Python 3.x language reference 中的一段话,大意是理解的,不过写不出一个这样的示例,求大神给个与这段话一致的示例:

When an instance method object is derived from a class method object, the “class instance” stored in self will actually be the class itself, so that calling either x.f(1) or C.f(1) is equivalent to calling f(C,1) where f is the underlying function.

PHPzPHPz2804일 전976

모든 응답(2)나는 대답할 것이다

  • 黄舟

    黄舟2017-04-17 17:55:52

    실제로 이 부분은 직접 실험을 해보면 이해하게 될 것입니다.


    원문에서 시작하여 두 단락으로 나누어 논의해 보겠습니다. 첫 번째 단락은 다음과 같습니다.

    인스턴스 메소드 객체가 호출되면 기본 함수(__func__)가 호출되어 인수 목록 앞에 클래스 인스턴스(__self__)가 삽입됩니다. 예를 들어 C가 다음에 대한 정의를 포함하는 클래스인 경우. 함수 f()이고 x는 C의 인스턴스입니다. x.f(1)를 호출하는 것은 C.f(x, 1)를 호출하는 것과 동일합니다.

    원본 기사의 첫 번째 단락에서는 instance method object이 호출될 때 __func__의 첫 번째 매개변수가 먼저 class instance로 대체된 후 호출된다고 나와 있으며 그 다음 예를 제시합니다.

    으아악

    다음 예를 사용하여 설명합니다. 여기에는 Demo 함수와 그 아래에 foo 함수가 있는 bar 클래스가 있습니다.

    Demo카테고리:

    으아악

    사실:

    1. foo용 Python은 에서 참조하는 일반 함수Demo.foo를 생성합니다.

    2. demo.foo을 작성하면 Python은 즉시 바운드 메서드 개체를 생성합니다. 이 메서드 개체는 무엇에 바인딩됩니까? demo.foo 인스턴스를 바인딩하려면 demodemo.foo.__self__을 참조하고 Python도 demoDemo.foo을 기록합니다. demo.foo.__func__

    3. 그래서 이

      이 호출되면(demo.foo) 실제로 demo.foo(1,2,3)를 호출하고 demo.foo.__func__(실제로는 demo.foo.__self__ 자체)를 첫 번째 매개변수로 사용합니다. demo

    우리가 작성한 클래스를 사용하여 표시하면 그의 예는 다음과 같습니다.

    으아악

    코드를 보세요: 으아악

    테스트 결과: 으아악


    두 번째 단락 읽기:

    인스턴스 메소드 객체가 클래스 메소드 객체에서 파생되면 self에 저장된 "클래스 인스턴스"는 실제로 클래스 자체가 되므로 x.f(1) 또는 C.f(1)을 호출하는 것은 다음과 동일합니다. f(C,1)을 호출합니다. 여기서 f는 기본 함수입니다.

    두 번째 단락의 주요 아이디어는 인스턴스 메소드 객체가 클래스 메소드 객체에서 나올 때

    에 존재하는 self클래스 인스턴스클래스 <🎜가 된다는 것입니다. > 자체, 그리고 또 다른 예: 으아악 또한 예시를 사용하여 설명합니다.

    1. Python은 Demo.bar클래스 메소드 객체에서 바운드 메소드 객체인 bar에 대해 을 생성합니다. 원래 Demo.barDemo.foo과 같습니다. 도 일반 Python 함수이지만 데코레이터(@classmethod 데코레이터)를 통해 바인딩된 메소드 객체가 됩니다. 동시에 원래의 일반 함수를 관찰하려면 Demo.bar.__func__에서만 볼 수 있습니다. Demo 클래스에 바인딩되어 있으므로 Demo.bar.__self__Demo 클래스를 참조합니다.

    2. 따라서 Demo.bar이 호출되면(Demo.bar(1)) 실제로 Demo.bar.__func__을 호출하고 Demo.bar.__self__(실제로는 Demo 자신)을 첫 번째 매개변수로 사용합니다.

    우리가 작성한 클래스를 사용하여 표시하면 그의 예는 다음과 같습니다.

    으아악

    테스트 코드:

    으아악

    테스트 결과:

    으아악

    결론:

    1. Python3에는 클래스에 두 가지 유형의 함수가 있는데, 하나는 일반 함수 객체이고 다른 하나는 바인딩된 메소드 객체입니다

    2. 인스턴스 메소드는 인스턴스에 바인딩된 일반 함수로 구성된 메소드 객체이고, 클래스 mehtod는 클래스에 바인딩된 일반 함수로 구성된 메소드 객체입니다

    3. 바운드 메소드가 호출되면 실제로 원래 함수(__func__에 기록됨)를 호출하지만 바인딩된 객체는 첫 번째 매개변수(__self__에 기록됨)로 사용됩니다.


    참고자료:

    메서드와 함수의 차이점
    파이썬에서 인스턴스 메서드 객체를 생성하는 방법의 차이점

    회신하다
    0
  • 大家讲道理

    大家讲道理2017-04-17 17:55:52

    으아악

    회신하다
    0
  • 취소회신하다