>  기사  >  백엔드 개발  >  Python의 super 함수는 상속을 어떻게 구현합니까?

Python의 super 함수는 상속을 어떻게 구현합니까?

不言
不言앞으로
2019-03-06 15:21:472072검색

이 기사는 Python에서 super 함수의 상속을 구현하는 방법에 대한 것입니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

Py 2.x와 Py 3.x의 큰 차이점은 클래스 정의든 클래스 상속이든 클래스입니다. Py 3.x에서 클래스 상속은 원래 super(Class, self) 대신 super() 키워드를 직접 사용할 수 있습니다.

그럼 super()는 무엇을 기반으로 하나요? 오늘 분석해 보겠습니다.

super() 함수에는 전달된 두 매개 변수를 기반으로 다음과 같은 특정 기능이 있습니다.

첫 번째 매개 변수로 전달된 클래스 이름이 MRO의 현재 위치를 결정합니다. . MRO (메소드 결정 순서)

두 번째 매개변수로 전달된 self를 통해 현재 MRO 목록을 결정합니다.

def super(cls, inst):
   mro = inst.__class__.mro() #确定当前MRO列表
   return mro[mro.index(cls) + 1] #返回下一个类

다음 코드:

class A(object):
    def name(self):
        print('name is xiaoming')    
        #super(A,self).name()

class B(object): 
    def name(self):
        print('name is cat')
      
class C(A,B):
    def name(self):
        print('name is wang')
        super(C,self).name()if __name__ == '__main__':

c = C()
print(c.__class__.__mro__)
c.name()

위 코드 출력을 실행합니다. 클래스 C의 super() 함수가 실행되면 클래스 A의 name 함수가 실제로 호출됩니다. super() 함수는 A에서 주석 처리되어 실행이 뒤로 계속되지 않습니다. 그리고 현재 MRO 목록 순서는 C,A,B,object로 출력됩니다.

(<class &#39;__main__.C&#39;>, <class &#39;__main__.A&#39;>, <class &#39;__main__.B&#39;>, <class &#39;object&#39;>)name is wangname is xiaoming

클래스 A의 주석을 제거하면 실행 코드 출력은 다음과 같습니다. A가 실행되면, 계속 B의 name() 함수가 실행됩니다. B에 여전히 super 함수가 있으면 계속해서 object에 name() 함수가 있는지 확인합니다.

(<class &#39;__main__.C&#39;>, <class &#39;__main__.A&#39;>, <class &#39;__main__.B&#39;>, <class &#39;object&#39;>)name is wangname is xiaomingname is cat

위 내용은 Python의 super 함수는 상속을 어떻게 구현합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 Python에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제