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 중국어 웹사이트의 기타 관련 기사를 참조하세요!