복붙노트

[PYTHON] super ()와 superclass를 직접 호출하는 것의 차이점

PYTHON

super ()와 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. ==============================

    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 ()를 사용하여 모든 것이 작동하는지 확인해야하며 너무 걱정하지 않아도됩니다.

  2. from https://stackoverflow.com/questions/21639788/difference-between-super-and-calling-superclass-directly by cc-by-sa and MIT license