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

Python의 super()의 기능과 원리에 대한 자세한 소개

高洛峰
高洛峰원래의
2017-03-19 15:03:031080검색

Python에서 object 메서드의 정의는 매우 이상합니다. 첫 번째 매개 변수는 일반적으로 개체를 전달하는 데 사용되는 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()

결과:

E 입력

B 입력

A 입력

A 나가기

B 탈퇴

C 입력

A 입력

A 탈퇴

C 탈퇴

D 입력

입력 A

Leave A

Leave D

Leave E

실행 순서를 이해하기 쉽다는 점은 public 부모 클래스라는 점입니다. 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 메커니즘은 나중에 자세히 소개됩니다.

위 내용은 Python의 super()의 기능과 원리에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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