下面是 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.
실제로 이 부분은 직접 실험을 해보면 이해하게 될 것입니다.
원문에서 시작하여 두 단락으로 나누어 논의해 보겠습니다. 첫 번째 단락은 다음과 같습니다.
원본 기사의 첫 번째 단락에서는
으아악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
클래스 인스턴스가 클래스 자체, 그리고 또 다른 예: 으아악 또한 예시를 사용하여 설명합니다.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__
에 기록됨)로 사용됩니다.참고자료:
메서드와 함수의 차이점
파이썬에서 인스턴스 메서드 객체를 생성하는 방법의 차이점
으아악