下面是 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.
黄舟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
카테고리:
사실:
foo
용 Python은 에서 참조하는 일반 함수Demo.foo
를 생성합니다.
demo.foo
을 작성하면 Python은 즉시 바운드 메서드 개체를 생성합니다. 이 메서드 개체는 무엇에 바인딩됩니까? demo.foo
인스턴스를 바인딩하려면 demo
이 demo.foo.__self__
을 참조하고 Python도 demo
에 Demo.foo
을 기록합니다. demo.foo.__func__
이 호출되면(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
클래스 인스턴스가 클래스 <🎜가 된다는 것입니다. > 자체, 그리고 또 다른 예:
으아악
또한 예시를 사용하여 설명합니다.
Python은 Demo.bar
클래스 메소드 객체에서 바운드 메소드 객체인 bar에 대해 을 생성합니다. 원래 Demo.bar
는 Demo.foo
과 같습니다. 도 일반 Python 함수이지만 데코레이터(@classmethod
데코레이터)를 통해 바인딩된 메소드 객체가 됩니다. 동시에 원래의 일반 함수를 관찰하려면 Demo.bar.__func__
에서만 볼 수 있습니다. Demo
클래스에 바인딩되어 있으므로 Demo.bar.__self__
는 Demo
클래스를 참조합니다.
따라서 Demo.bar
이 호출되면(Demo.bar(1)
) 실제로 Demo.bar.__func__
을 호출하고 Demo.bar.__self__
(실제로는 Demo
자신)을 첫 번째 매개변수로 사용합니다.
우리가 작성한 클래스를 사용하여 표시하면 그의 예는 다음과 같습니다.
으아악테스트 코드:
으아악테스트 결과:
으아악결론:
Python3에는 클래스에 두 가지 유형의 함수가 있는데, 하나는 일반 함수 객체이고 다른 하나는 바인딩된 메소드 객체입니다
인스턴스 메소드는 인스턴스에 바인딩된 일반 함수로 구성된 메소드 객체이고, 클래스 mehtod는 클래스에 바인딩된 일반 함수로 구성된 메소드 객체입니다
바운드 메소드가 호출되면 실제로 원래 함수(__func__
에 기록됨)를 호출하지만 바인딩된 객체는 첫 번째 매개변수(__self__
에 기록됨)로 사용됩니다.
참고자료:
메서드와 함수의 차이점
파이썬에서 인스턴스 메서드 객체를 생성하는 방법의 차이점