Python 의 슈퍼()방법 을 깊이 이해 합 니 다.

3729 단어 pythonsuper()방법.
머리말
python 의 클래스 는 각각 신식 클래스 와 고전 클래스 가 있 으 며,다 중 계승 을 지원 합 니 다.클래스 의 계승 에서 부모 클래스 를 덮어 쓰 는 방법 이 아 닌 부모 클래스 를 다시 쓰 려 면 슈퍼()방법 으로 이 루어 질 수 있 습 니 다.
python 언어 는 C++와 비슷 한 클래스 계승 이 있 습 니 다.클래스 정의 시 python 에서 첫 번 째 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 에서 슈퍼()메커니즘 도 제 공 했 습 니 다.예 는 다음 과 같 습 니 다.

>>> 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! 
주의 하 다.
Python 2.2 이전 버 전:고전 클래스(classic class)시대
고전 클래스 는 계승 되 지 않 은 클래스 입 니 다.인 스 턴 스 유형 은 모두 type 형식 입 니 다.고전 클래스 가 부모 클래스 로 사용 되면 하위 클래스 가 부모 클래스 의 구조 함 수 를 호출 할 때 이러한 오 류 를 되 돌려 줍 니 다.'type Error:must be type,not classobject''
이때 MRO 의 방법 은 DFS(깊이 우선 검색(하위 노드 순서:왼쪽 에서 오른쪽으로)입 니 다.그래서 본 논문 에서 사용 하 는 것 은 신식 류 이 고 신식 류 의 검색 알고리즘 은 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'기능 을 새로 추가 한 것 입 니 다.슈퍼 의 역할 은 바로 하위 클래스 에서 부 류 를 호출 하 는 방법 이다.이것 도 하나의 계승 에서 흔히 볼 수 있 는 슈퍼()를 호출 하 는 용법 이다.그러면 문제 가 왔 습 니 다.

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 의 출력 은 무엇 입 니까?왜 결 과 는 2 일 까요?5 가 아 닌 2 일 까요?슈퍼(B,self).minus(m)는 분명히 부모 클래스 의 minus 방법 을 호출 했 지만 출력 결 과 는 2 입 니 다.현재 B 의 인 스 턴 스 를 알 아야 합 니 다.A 의 인 스 턴 스 가 아 닌 self.n 의 수 치 는 10 이 아 닌 7 입 니 다.
그렇다면 더 물 려 받 을 때 슈퍼 는 어떻게 일 했 을 까?자,이제 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->object。어떻게 해야만 이 순서 가 옳다 는 것 을 검증 할 수 있 습 니까?

D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>)
므 로 가 뭐 죠?당신 이 정의 하 는 모든 클래스 에 대해 Python 은 하나의 방법 해석 순서(Method Resolution Order,MRO)목록 을 계산 합 니 다.이것 은 클래스 계승 순 서 를 대표 합 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기