python의 슈퍼()의 작용과 원리를 상세히 설명하다

4242 단어 pythonsuper()
Python에서 대상 방법의 정의는 매우 괴이하다. 첫 번째 매개 변수는 일반적으로self(다른 언어에 해당하는this)로 명명되어 대상 자체를 전달하는 데 사용되지만 호출할 때 현식 전달이 필요 없고 시스템이 자동으로 전달된다.
오늘 우리가 소개한 주인공은 슈퍼()입니다. 클래스의 계승에서 슈퍼()는 매우 자주 사용됩니다. 이것은 하위 클래스가 상위 클래스를 호출하는 방법의 일부 문제를 해결했습니다. 상위 클래스가 여러 번 호출되었을 때 한 번만 실행하고 실행 논리를 최적화했습니다. 다음은 상세하게 보겠습니다.
예를 들어 다음과 같이 하십시오.

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.
겉으로 보면 슈퍼(Foo Child, self).bar(메시지) 메서드 및 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 A

Leave C

Enter D

Enter A

Leave 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()
결과 내보내기

Enter E

Enter B

Enter C

Enter D

Enter A

Leave A

Leave D

Leave C

Leave B

Leave E
슈퍼 메커니즘에서 공공 부류는 한 번만 실행되고 실행 순서는 MRO(Method Resolution Order): 방법 해석 순서에 따라 진행된다.
이상은python의super()의 작용과 원리에 대한 상세한 내용입니다.pythonsuper()에 대한 더 많은 자료는 저희 다른 관련 글에 주목하세요!

좋은 웹페이지 즐겨찾기