Python 2.7.10에서
class OneMixin(object):
def __init__(self):
# super(OneMixin, self).__init__()
print "one mixin"
class TwoMixin(object):
def __init__(self):
# super(TwoMixin, self).__init__()
print "two mixin"
class Account(OneMixin, TwoMixin):
def __init__(self):
super(Account, self).__init__()
print "account"
Account.mro ()는 다음과 같습니다. [<class 'Account'>, <class 'OneMixin'>, <class 'TwoMixin'>, <type 'object'>]
모든 클래스가 MRO에 나열되어 있지만 "two mixin"은 인쇄되지 않습니다.
OneMixin과 TwoMixin에서 수퍼 콜의 주석 처리를 제거하면 MRO는 정확히 동일하지만 "two mixin"이 인쇄됩니다.
왜 다른가요? MRO의 모든 것이 호출되기를 기대합니다.
이는 super
유형의 부모 또는 형제 클래스에 호출을 위임하는 데 사용 되기 때문 입니다. Python 문서 에는 두 번째 사용 사례에 대한 다음 설명이 있습니다.
두 번째 사용 사례는 동적 실행 환경에서 협력 적 다중 상속을 지원하는 것입니다. 이 사용 사례는 Python에 고유하며 정적으로 컴파일 된 언어 또는 단일 상속 만 지원하는 언어에서는 찾을 수 없습니다. 이를 통해 여러 기본 클래스가 동일한 메서드를 구현하는 "다이아몬드 다이어그램"을 구현할 수 있습니다. 좋은 디자인은이 메서드가 모든 경우에 동일한 호출 서명을 갖도록 지정합니다 (호출 순서는 런타임에 결정되기 때문입니다. 그 순서는 클래스 계층 구조의 변경 사항에 적응하고 해당 순서는 런타임 전에 알 수없는 형제 클래스를 포함 할 수 있기 때문입니다) ).
super
호출 을 제거하면 OneMixin
MRO의 다음 유형으로 호출을 위임하는 것이 없습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다