>  기사  >  백엔드 개발  >  Python의 super() 메소드

Python의 super() 메소드

不言
不言원래의
2018-06-01 16:36:221571검색

이 글에서는 Python에서 특정 참조 값을 갖는 super() 메서드를 주로 소개합니다. 이제 모든 사람과 공유합니다. 도움이 필요한 친구들이 참조할 수 있습니다.

super는 다중 상속 문제를 해결하는 데 사용되며, 클래스 이름을 직접 사용합니다. 단일 상속을 사용할 경우 부모 클래스 메서드는 문제가 없지만 다중 상속을 사용하면 검색 순서(MRO), 반복 호출(다이아몬드 상속) 등 다양한 문제가 발생합니다. 이번 글에서는 주로 Python의 super() 메소드 관련 정보를 소개합니다. 도움이 필요한 친구들이 참고할 수 있습니다.

머리말

Python 클래스에는 다중 상속을 지원하는 새로운 스타일 클래스와 클래식 클래스가 포함되어 있습니다. 클래스 상속에서 부모 클래스 메서드를 재정의하는 대신 super() 메서드를 사용하면 이를 달성할 수 있습니다. Python 언어와 C++에는 클래스 정의에서 첫 번째 self가 있습니다. C++의 this 포인터와 유사하게 Python에서 개체 자체를 가리키는 사용자 정의됩니다.


파이썬의 간단한 클래스 예:


>>> class hello(object): 
...     def print_c(): 
...       print"hello world!" 
>>> hello().print_c() 
hello world!

물론 실제로는 하위 클래스가 상위 클래스를 상속하는 것이 불가피합니다. 일반적으로 다음과 같습니다.


>>> class child(hello): 
...     def print_c(self): 
...         hello().print_c() 
...          
>>> child().print_c() 
hello world!

또한 Python에서도 super() 메커니즘이 제공되며 예는 다음과 같습니다.


>>> class hello(object): 
...     def print_c(self): 
...       print"hello world!" 
...        
>>> class child(hello): 
...     def print_c(self): 
...         super(child,self).print_c() 
...          
>>> child().print_c() 
hello world!

NotePython2.2 이전 버전: 클래식 클래스 시대


클래식 클래스는 상속이 없는 유형입니다. 클래스 및 인스턴스 유형은 모두 유형 유형입니다. 클래식 클래스를 상위 클래스로 사용하는 경우 하위 클래스는 상위 클래스의 생성자를 호출할 때 ''TypeError: must be type'과 같은 오류를 반환합니다. , not classobj'''


이때 MRO의 방식은 DFS(깊이 우선 탐색(하위 노드 순서: 왼쪽에서 오른쪽))입니다. 따라서 본 글에서는 new-style 클래스를 사용하였으며, new-style 클래스에 대한 검색 알고리즘은 C3 알고리즘입니다


class C(object):
 def minus(self,x):
  return x/2

class D(C):
 def minus(self,x):
  super(D, self).minus()
  print 'hello'

위 코드에서 C는 상위 클래스이고 D는 하위 클래스입니다. . 클래스 D에서 minus 메소드를 재정의했습니다. C 클래스의 기능을 기반으로 print 'hello' 함수를 추가하는 것입니다. 여기서 super의 역할은 하위 클래스에서 상위 클래스의 메소드를 호출하는 것입니다. 이는 단일 상속에서 super()를 호출하는 일반적인 사용법이기도 합니다. 그럼 질문이 생깁니다

class A(object):
 def __init__(self):
  self.n = 10

 def minus(self, m):
  self.n -= m


class B(A):
 def __init__(self):
  self.n = 7

 def minus(self, m):
  super(B,self).minus(m)
  self.n -= 2
b=B()
b.minus(2)
print b.n

위 코드에서 b.n의 출력은 무엇인가요? 결과가 5가 아닌 2인 이유는 무엇입니까? super(B,self).minus(m)은 명확하게 상위 클래스의 마이너스 메소드를 호출하지만 출력 결과는 2입니다. B의 현재 인스턴스는 A의 인스턴스가 아니므로 self의 값은 2입니다. .n이 통과되었습니다. 10이 아니라 7입니다.

다중 상속이 있을 때 super는 어떻게 작동하나요? 자, 이제 A를 상속하는 클래스 C를 만들고, B와 C를 상속하는 클래스 D를 만들고, 슈퍼 재정의 메서드를 호출하는 방법을 알아보세요.

class C(A):
 def __init__(self):
  self.n = 12

 def minus(self, m):
  super(C,self).minus(m)
  self.n -= 5


class D(B, C):
 def __init__(self):
  self.n = 15

 def minus(self, m):
  super(D,self).minus(m)
  self.n -= 2

d=D()
d.minus(2)
print d.n

위 코드의 출력 결과는 무엇인가요? 조급해하지 말고 먼저 어떻게 작동하는지 살펴보세요. 위에서 언급했듯이 새 클래스는 하위 노드를 검색할 때 C3 알고리즘을 사용합니다. 그럼 어떻게 발견되나요? D->B->C->A->객체. 이 주문이 올바른지 어떻게 확인할 수 있나요?

D.__mro__
(<class &#39;__main__.D&#39;>, <class &#39;__main__.B&#39;>, <class &#39;__main__.C&#39;>, <class &#39;__main__.A&#39;>, <type &#39;object&#39;>)

미로란? 정의한 각 클래스에 대해 Python은 클래스 상속 순서를 나타내는 MRO(메서드 해결 순서) 목록을 계산합니다.

관련 권장사항:

파이썬에서 super() 함수의 사용법과 작동 원리에 대한 자세한 설명


위 내용은 Python의 super() 메소드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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