2017-11-24 3 views
0

맞아요. 그래서 스퀘어가 실제로 2 명의 부모를 필요로하지 않는 것처럼 특정 중복을 무시하고 학교 프로젝트를 위해이 상속 계층을 만들어야합니다. 나는 이상한 길을 발견했습니다. 파이썬은 슈퍼 콜을 처리합니다.다중 상속 및 다단계 상속

다음 코드에서 사각형을 초기화 할 때 super를 호출하여 Rectangle의 초기화 메서드를 실행합니다. 이것은 의미가 있습니다. 그런 다음 직사각형이 super를 호출하여 평행 사변형의 초기화 메소드로 이동해야합니다. 그러나, 일부 디버깅 후, 나는 그것의 수퍼 콜을 할 때, 실제로 Rhombus의 초기화 메소드를 호출한다는 것을 발견했다. 누군가 여기서 일어나는 일을 설명하고 가능하다면 명시 적으로 클래스 이름을 사용하지 않고 이것을 올바르게 구현할 수 있습니까?

관련 코드는 다음과 같습니다.

class Parallelogram: 
    def __init__(self, base, side, theta): 
     self.base = base 
     self.side = side 
     self.theta = theta 

class Rectangle(Parallelogram): 
    def __init__(self, base, side): 
     super(Rectangle, self).__init__(base, side, 90) 

class Rhombus(Parallelogram): 
    def __init__(self, side, theta): 
     super(Rhombus, self).__init__(side, side, theta) 

class Square(Rectangle, Rhombus): 
    def __init__(self, side): 
     super(Square, self).__init__(side, side) 
+0

당신이 방법을 확인 순서에게의 –

+2

가능한 중복을 알고 당신의 전화 클래스 객체의 MRO를 통해 상속의 실행 순서를 확인하실 수 있습니다 [파이썬의 슈퍼()와 어떻게 작동 하는가 다중 상속?] (https://stackoverflow.com/questions/3277367/how-does-pythons-super-work-with-multiple-inheritance) –

+0

이것을 보는 것은 python-3.x에 태그가 붙어 있습니다. super()는 인수없이 끝났다. 추천 읽기 : [Python의 super() 슈퍼로 간주!] (https://rhettinger.wordpress.com/2011/05/26/super-considered-super/) –

답변

0

당신이

In [257]: Square.__mro__ 
Out[257]: 
(__main__.Square, 
__main__.Rectangle, 
__main__.Rhombus, 
__main__.Parallelogram, 
object) 
+0

이제는 왜 이런 일이 발생하는지 이해합니다. 그러나 예방할 가장 좋은 방법은 무엇일까요? 예상대로 작동합니까? 내가 Parallelogram .__ init __()을 명시 적으로 호출해야할까요, 아니면 여전히 super()를 사용할 수있는 방법이 있습니까? – Kraton9000

+0

상속을 위해서 super를 사용해야하고, 달성하고자하는 것을 위해 super.function을 사용해야한다. init에 쓰여진 것을 얻기를 원하거나, 그 클래스에 쓰여진 함수를 호출 할 수있다. –