Programing

파이썬에서 체인 호출 부모 이니셜 라이저

lottogame 2020. 3. 23. 08:03
반응형

파이썬에서 체인 호출 부모 이니셜 라이저


이 질문에는 이미 답변이 있습니다.

이것을 고려하십시오-기본 클래스 A, 클래스 B는 A에서 상속, 클래스 C는 B에서 상속. 초 기자에서 부모 클래스 이니셜 라이저를 호출하는 일반적인 방법은 무엇입니까? 이것이 여전히 모호하게 들리면 여기에 코드가 있습니다.

class A(object):
    def __init__(self):
        print "Initialiser A was called"

class B(A):
    def __init__(self):
        super(B,self).__init__()
        print "Initialiser B was called"

class C(B):
    def __init__(self):
        super(C,self).__init__()
        print "Initialiser C was called"

c = C()

이것이 내가 지금하는 방법입니다. 그러나 여전히 약간 제네릭처럼 보이지만 손으로 ​​올바른 유형을 전달해야합니다.

이제 self.__class__super ()에 대한 첫 번째 인수로 사용하려고 시도 했지만 분명히 작동하지 않습니다. C의 초 기자에 충분히 넣으면 B의 초기자가 호출됩니다. B에서 동일한 작업을 수행해도 "self"는 여전히 C의 인스턴스를 가리 키므로 B의 이니셜 라이저를 다시 호출하게됩니다 (무한 재귀로 끝남).

지금은 다이아몬드 상속에 대해 생각할 필요가 없습니다. 저는이 특정한 문제를 해결하는 데 관심이 있습니다.


당신이하는 방식은 실제로 권장되는 방법입니다 (Python 2.x의 경우).

클래스가 명시 적으로 전달되는지의 문제는 super기능보다는 스타일의 문제입니다. super"명시적인 것이 묵시적인 것보다 낫다"는 Python의 철학에 맞는 클래스를 전달합니다 .


Python 3에는 다음과 같이 사용할 수있는 향상된 super ()가 포함되어 있습니다.

super().__init__(args)

간단히 쓸 수 있습니다 :

class A(object):

    def __init__(self):
        print "Initialiser A was called"

class B(A):

    def __init__(self):
        A.__init__(self)
        # A.__init__(self,<parameters>) if you want to call with parameters
        print "Initialiser B was called"

class C(B):

    def __init__(self):
        # A.__init__(self) # if you want to call most super class...
        B.__init__(self)
        print "Initialiser C was called"

참고 URL : https://stackoverflow.com/questions/904036/chain-calling-parent-initialisers-in-python


반응형