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.
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 입력
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 입력
D 입력
A 입력
A 탈퇴
D 탈퇴
C 탈퇴
B 탈퇴
E 탈퇴
수퍼 메커니즘에서는 공개 상위 클래스가 한 번만 실행되도록 보장할 수 있으며, 실행 순서는 MRO(Method Resolution Order): 메서드 해결 순서를 따릅니다. 이 MRO 메커니즘은 나중에 자세히 소개됩니다.