이것을 고려하십시오 - 기본 클래스 A, B를 상속 한 클래스 C, B를 상속 한 클래스 C 생성자에서 부모 클래스 생성자를 호출하는 일반적인 방법은 무엇입니까? 그래도 여전히 너무 애매한 경우 여기에 몇 가지 코드가 있습니다.파이썬에서 체인 호출 상위 생성자
class A(object):
def __init__(self):
print "Constructor A was called"
class B(A):
def __init__(self):
super(B,self).__init__()
print "Constructor B was called"
class C(B):
def __init__(self):
super(C,self).__init__()
print "Constructor C was called"
c = C()
지금 내가하는 방법입니다. 그러나 여전히 너무 비 범용적인 것으로 보입니다. 올바른 유형을 수동으로 전달해야합니다.
이제 super()에 대한 첫 번째 인수로 self.__class__
을 사용해 보았습니다.하지만 분명히 작동하지 않습니다. C의 생성자에 넣으면 B의 생성자가 호출됩니다. B에서 똑같이하면 "self"는 여전히 C의 인스턴스를 가리 키므로 결국 B의 생성자를 다시 호출하게됩니다 (이 작업은 무한 재귀에서 끝납니다).
다이아몬드 상속을 지금 당장 생각할 필요가 없습니다.이 특정 문제를 해결하는 데 관심이 있습니다.
을 "하지만 여전히 조금 너무 제네릭이 아닌 것을 - 당신 손으로 올바른 유형을 통과해야합니다. " 클래스 이름을 super()에 전달하고 있습니다. 수퍼 클래스 또는 다른 것을 알 필요가 없습니다. 이것은 비 제너릭 (non-generic) 인 방법은 무엇입니까? 어떤 문제가 발생합니까? 이 부분이 깨지는 사례를 줄 수 있습니까? –
충분한 경우이 질문에 답변 할 준비가되지 않았습니다. 하지만 어쨌든 클래스 이름이 변경되면 어떻게 될까요? 이런 종류의 체인을 자동화하는 데코레이터 함수를 작성하고자한다면 어떻게해야할까요? 이제는 이것이 불가능하다는 것을 알았지 만 질문을 할 때 나는 그것을 알지 못했습니다. – shylent