Python에서 super () 의 상세 설명과 장면 적용 예시를 보여줍니다
기사 목록입니다.
첫째, 서언입니다.
2. 슈퍼가 뭐예요
3. super의 자주 사용하는 장면입니다.
첫째, 서언입니다.
최근 super 관련 문의가 왔는데 인터넷에 검색된 튜토리얼이 이해하기 쉽지 않아 보고도 잘 이해가 안 된다고 하네요.그래서 여기에서는 저만의 이해를 바탕으로 슈퍼에 대해 알아보겠습니다.
2. 슈퍼가 뭐예요
1.슈퍼도 한 종류죠, 그렇죠.그는 방법도 아니고 내장된 키워드도 아닙니다
class A:
pass
print(type(super(A)))
결과를 출력합니다
<class 'super'>
super의 소스코드를 직접 봐도 알 수 있습니다
또한, super는 부류의 방법을 호출하는 데 사용된다는 인터넷 기사도 잘못된 관점입니다!
가령 다음과 같은 예가 있습니다
class A:
def __init__(self):
print("A")
class B(A):
def __init__(self):
print("B")
super().__init__()
class C(A):
def __init__(self):
print("C")
super().__init__()
class D(B, C):
def __init__(self):
print("D")
super().__init__()
D()
"super는 부류를 호출하는 방법"이라는 이해에 비추어 볼 때, 상기 코드의 실행 과정은 다음과 같아야 합니다.
print("D") - [super는 B와 C를 차례로 실행함] - B:print("B") - [super는 A를 실행합니다] - print("A") - [super는 B와 C를 차례로 실행함] - [super는 A를 차례로 실행함] - print("C") - [super는 A를 차례로 실행함] - print("A")를 실행합니다.
실행 결과 이론은 다음과 같아야 합니다: DBACA
하지만 실제 상황은 그렇지 않습니다!
실제 실행 결과입니다
D
B
C
A
그래서 '슈퍼란 부류를 호출하는 방법'이라는 말은 틀렸습니다!
실제로 super 호출은 Python의 [MRO(방법 해석 순서)]에 따라 수행되며, Python3에서 MRO는 C3 알고리즘을 기반으로 구현됩니다
3. super의 자주 사용하는 장면입니다.
1. 만약 우리가 상속받은 여러 부모에 같은 이름의 메서드가 있다면, super를 사용하여 사용할 부모에 대한 메서드를 지정할 수 있습니다.
class A:
def test(self):
print('A')
class B:
def test(self):
print('B')
class C(A, B):
def __init__(self):
super( ).test( ) # 클래스 A에서 test 메서드를 호출합니다
super(C, self).test( ) # 클래스 A에서 test 메서드를 호출합니다
super( A, self).test( ) # 클래스 B의 test 메서드를 불러옵니다
C()
결과를 출력합니다
A
A
B
2. 하위 클래스에서 상위 클래스의 메서드를 사용하고 특정 확장을 원하지만 완전히 다시 쓰기를 원하지 않는 경우 super()를 사용하여 메서드를 증분 수정할 수 있습니다.
일례로 우리가 list에 있는 append의 방법을 중국어로 바꾸려면 어떻게 해야 하나요?
그리고 python에서 list가 append 메서드를 호출하면 반환값이 없습니다. 요소 추가 작업이 성공한 후 반환 값을 추가하여 성공적으로 반환하려면 어떻게 해야 합니까?
먼저 원래 list를 호출해서 실행한 결과를 보겠습니다
a=list()
res=a.append(1)
print(res)
결과를 출력합니다
None
append 메서드를 호출하고 None을 반환하는 것을 볼 수 있습니다
이제 우리는 super를 통해 다시 쓰고, 반환 값을 가지며, append를 중국어로 직접 호출할 수 있습니다.
class 목록( list):
def 추가 (self, *args, **kwargs):
super().append(*args, **kwargs)
return "추가되었습니다"
x = 목록입니다( )
res = x.(1) 을( 를) 추가합니다.
print(res)
print(x)
결과를 출력합니다
성공적으로 추가되었습니다.
[1]
super는 실제로 많이 사용되는데, 예를 들어 restfremework에서 응답 결과의 Response 정보를 다시 써야 할 경우 django의 미들웨어를 통해 구현하는 것 외에도 super를 사용하여 dispatch를 다시 쓰는 것도 가능합니다