기사 목록입니다.
첫째, 서언입니다.
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를 다시 쓰는 것도 가능합니다
'개발 꿀팁 > PYTHON' 카테고리의 다른 글
selenium 프레임워크 stealth.min.js 파일은 브라우저 지문 기능을 숨깁니다 (0) | 2022.12.02 |
---|---|
kali Linux에서 python 2.7을 설치합니다. (python 3도 일반적입니다) (0) | 2022.12.02 |
세 줄의 코드를 사용하여 Python을 사용하여 동영상을 Gif로 변환합니다 (0) | 2022.12.02 |
Python 캐시 lru_cache의 소개와 설명입니다 (0) | 2022.12.02 |
Python 컨텍스트 매니저를 이해합니다 (0) | 2022.12.02 |