개발 꿀팁/PYTHON

Python에서 super () 의 상세 설명과 장면 적용 예시를 보여줍니다

Jammie 2022. 12. 2. 14:14
반응형

기사 목록입니다.
첫째, 서언입니다.
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를 다시 쓰는 것도 가능합니다

 

반응형