Python에서 super() 함수의 사용법과 작동 원리에 대한 자세한 설명

巴扎黑
풀어 주다: 2017-08-21 14:57:42
원래의
6163명이 탐색했습니다.

Python의 객체 메서드 정의는 매우 이상합니다. 첫 번째 매개변수는 일반적으로 self라는 이름으로 지정되며(다른 언어에서는 이와 동일함) 시스템을 호출할 때 명시적으로 전달할 필요가 없습니다. 자동으로 통과됩니다.

오늘 소개하는 주인공은 super()입니다. Super()는 클래스 상속에 매우 일반적으로 사용됩니다. 이는 상위 클래스 메서드를 호출하는 하위 클래스의 일부 문제를 해결합니다. 실행을 최적화합니다. 아래에서 자세히 살펴보겠습니다.

예를 들어보세요:

class Foo:
  def bar(self, message):
    print(message)
로그인 후 복사
>>> Foo().bar("Hello, Python.")
Hello, Python.
로그인 후 복사

상속 관계가 있는 경우 하위 클래스에서 상위 클래스의 메서드를 호출해야 하는 경우가 있습니다. 이때 가장 간단한 방법은 개체 호출을 클래스 호출로 변환하는 것입니다. 이때 self 매개변수는 명시적으로 전달되어야 합니다. 예:

class FooParent:
  def bar(self, message):
    print(message)
class FooChild(FooParent):
  def bar(self, message):
    FooParent.bar(self, message)
로그인 후 복사
>>> FooChild().bar("Hello, Python.")
Hello, Python.
로그인 후 복사
로그인 후 복사

여기에는 몇 가지 단점이 있습니다. 예를 들어 상위 클래스 이름이 수정되면 하위 클래스에도 여러 수정이 포함됩니다. , Python은 위에서 언급한 것처럼 다중 상속을 허용하는 언어입니다. 다중 상속이 있는 경우 위에 표시된 메서드를 여러 번 작성해야 하므로 번거롭습니다. 이러한 문제를 해결하기 위해 Python에서는 super() 메커니즘을 도입했습니다. 예제 코드는 다음과 같습니다.

class FooParent:
  def bar(self, message):
    print(message)
class FooChild(FooParent):
  def bar(self, message):
    super(FooChild, self).bar(message)
로그인 후 복사
>>> FooChild().bar("Hello, Python.")
Hello, Python.
로그인 후 복사
로그인 후 복사

표면적으로는 super(FooChild, self).bar(message) 메서드와 FooParent.bar의 결과입니다. (self, message) 메소드는 일관됩니다. 사실 이 두 메소드의 내부 처리 메커니즘은 매우 다릅니다. 다중 상속이 포함되면 명백한 차이점이 있습니다. 직접 예를 들어보겠습니다.

코드 1:

class A:
  def __init__(self):
    print("Enter A")
    print("Leave A")
class B(A):
  def __init__(self):
    print("Enter B")
    A.__init__(self)
    print("Leave B")
class C(A):
  def __init__(self):
    print("Enter C")
    A.__init__(self)
    print("Leave C")
class D(A):
  def __init__(self):
    print("Enter D")
    A.__init__(self)
    print("Leave D")
class E(B, C, D):
  def __init__(self):
    print("Enter E")
    B.__init__(self)
    C.__init__(self)
    D.__init__(self)
    print("Leave E")
E()
로그인 후 복사

결과:

Enter E

Enter B

Enter A

Leave A

Leave B

Enter C

Enter A

Leave C

Enter D

A를 떠나

Leave E

실행 순서는 이해하기 쉽습니다. 주의가 필요한 유일한 것은 공개 상위 클래스 A가 여러 번 실행된다는 것입니다.

코드 2:

class A:
  def __init__(self):
    print("Enter A")
    print("Leave A")
class B(A):
  def __init__(self):
    print("Enter B")
    super(B, self).__init__()
    print("Leave B")
class C(A):
  def __init__(self):
    print("Enter C")
    super(C, self).__init__()
    print("Leave C")
class D(A):
  def __init__(self):
    print("Enter D")
    super(D, self).__init__()
    print("Leave D")
class E(B, C, D):
  def __init__(self):
    print("Enter E")
    super(E, self).__init__()
    print("Leave E")
E()
로그인 후 복사

결과:

Enter E

Enter B

Enter C

Enter D

Enter D

Enter A

Leave A

Leave D

Leave C

Leave B

E를 떠나

슈퍼 메커니즘에서는 공개 상위 클래스가 한 번만 실행되도록 보장할 수 있으며, 실행 순서는 MRO(메소드 해결 순서): 메서드 해결 순서를 따릅니다. 이 MRO 메커니즘은 나중에 자세히 소개됩니다.

위 내용은 Python에서 super() 함수의 사용법과 작동 원리에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿