[PYTHON] super ()와 superclass를 직접 호출하는 것의 차이점
PYTHONsuper ()와 superclass를 직접 호출하는 것의 차이점
파이썬 2.7과 3에서는 다음 메소드를 사용하여 수퍼 클래스의 함수를 호출합니다.
class C(B):
def __init__(self):
B.__init__(self)
나는 B와 .__ init __ (self)를 super (B, self) .__ init __ () 그리고 python3 super () .__ init __ ()로 대체하는 것이 가능하다는 것을 알고있다.
이 방법으로 어떤 이점이나 단점이 있습니까? 적어도 나를 위해 B에서 직접 호출하는 것이 더 합리적입니다.하지만 아마도 super ()가 메타 클래스 (일반적으로 피하는)를 사용할 때만 사용할 수있는 좋은 이유가있을 수 있습니다.
해결법
-
==============================
1.단일 상속의 경우, super ()는 기본 유형을 참조하는 더 멋진 방법 일뿐입니다. 그렇게하면 기본 유형의 이름을 변경하려는 경우와 같이 코드를보다 관리하기 쉽게 만들 수 있습니다. 슈퍼를 사방에 사용하는 경우 클래스 라인에서 슈퍼를 변경하기 만하면됩니다.
단일 상속의 경우, super ()는 기본 유형을 참조하는 더 멋진 방법 일뿐입니다. 그렇게하면 기본 유형의 이름을 변경하려는 경우와 같이 코드를보다 관리하기 쉽게 만들 수 있습니다. 슈퍼를 사방에 사용하는 경우 클래스 라인에서 슈퍼를 변경하기 만하면됩니다.
실제 이점은 다중 상속과 함께 제공됩니다. super를 사용하면 단일 호출은 모든 기본 유형의 메소드를 올바른 상속 순서로 자동 호출 할뿐만 아니라 각 메소드가 한 번만 호출되도록합니다.
기본적으로 유형에 다이아몬드 속성이 있습니다. 당신은 하나의 기본 유형 A와 B와 C 두 가지 모두 A에서 파생 된 두 가지 유형이 있습니다. 그리고 B와 C 모두에서 상속받은 유형 D를가집니다 (암시 적으로 A에서 두번 상속받습니다). 명시 적으로 기본 유형의 메소드를 호출하면 A의 메소드를 두 번 호출하게됩니다. 하지만 슈퍼를 사용하면 한 번만 호출됩니다.
class A (object): def __init__ (self): super().__init__() print('A') class B (A): def __init__ (self): super().__init__() print('B') class C (A): def __init__ (self): super().__init__() print('C') class D (C, B): def __init__ (self): super().__init__() print('D')
D를 인스턴스화하면 다음과 같은 결과를 얻습니다.
>>> D() A B C D <__main__.D object at 0x000000000371DD30>
이제 기본 유형의 메소드를 수동으로 호출하여 다시 해보겠습니다.
class A2 (object): def __init__ (self): print('A2') class B2 (A2): def __init__ (self): A2.__init__(self) print('B2') class C2 (A2): def __init__ (self): A2.__init__(self) print('C2') class D2 (C2, B2): def __init__ (self): B2.__init__(self) C2.__init__(self) print('D2')
그리고 이것은 결과입니다 :
>>> D2() A2 B2 A2 C2 D2 <__main__.D2 object at 0x0000000003734E48>
보시다시피, A2는 두 번 발생합니다. 이것은 보통 당신이 원하는 것이 아닙니다. 슈퍼를 사용하는 기본 유형 중 하나의 메소드를 수동으로 호출 할 때 더욱 복잡해집니다. 따라서 대신 super ()를 사용하여 모든 것이 작동하는지 확인해야하며 너무 걱정하지 않아도됩니다.
from https://stackoverflow.com/questions/21639788/difference-between-super-and-calling-superclass-directly by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬 수퍼 클래스와 부모 클래스 속성 설정하기 (0) | 2018.11.22 |
---|---|
[PYTHON] Cython : cimport 및 가져 오기 numpy로 (모두) np (0) | 2018.11.22 |
[PYTHON] 파이썬 요청이 내 URL을 백분율로 인코딩하는 것을 방지하려면 어떻게해야합니까? (0) | 2018.11.22 |
[PYTHON] 파이썬으로 거대한 텍스트 파일을 분할하는 방법 (0) | 2018.11.22 |
[PYTHON] 파이썬으로 MTP USB 장치에 접근하는 법 (0) | 2018.11.22 |