>  기사  >  백엔드 개발  >  Python의 super()의 기능과 원리에 대한 자세한 설명

Python의 super()의 기능과 원리에 대한 자세한 설명

高洛峰
高洛峰원래의
2016-10-17 16:16:291232검색

Python의 객체 메소드 정의는 매우 이상합니다. 첫 번째 매개변수는 일반적으로 self라는 이름으로 지정되며(다른 언어에서는 이와 동일함) 호출할 때 객체 자체를 전달하는 데 사용됩니다. 시스템이 자동으로 전송됩니다.

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


예를 들어보세요:

class Foo:
  def bar(self, message):
    print(message)

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

>>> Foo().bar("Hello, Python.")
Hello, Python.

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)


표면적으로는 super(FooChild, self).bar(message) 메서드와 FooParent.bar(self, message) 메서드의 결과가 일관됩니다. 실제로 두 가지 방법의 결과는 동일합니다. 다중 상속이 포함되면 다음과 같은 예가 있습니다.

>>> FooChild().bar("Hello, Python.")
Hello, Python.

코드 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()
결과:

E 입력

B 입력

A 입력


A 입력

B 입력

C 입력

A 입력

A 입력

C 입력

D 입력

A 입력

A 입력

Leave D

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()
결과:

E 입력

B 입력

C 입력


D 입력

A 입력

A 탈퇴

D 탈퇴

C 탈퇴

B 탈퇴

E 탈퇴

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.