Python 의 슈퍼()방법 을 깊이 이해 합 니 다.
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)목록 을 계산 합 니 다.이것 은 클래스 계승 순 서 를 대표 합 니 다.총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.