336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

다중 상속의 경우 super() 를 이용하면 첫번째 부모만을 의미하기 때문에

super()만을 이용해서는 각각의 부모를 사용할 수 없다.


이때는 부모의 이름을 이용해서 직접 생성자를 호출해야 한다.

단, super() 를 이용하는 경우은 자동으로 self가 넘어가지만

부모의 이름을 이용하는 경우에는 self가 넘어가지 않기 때문에 명시적으로 첫번째 매개변수에 self를 넘겨줘야 한다.



부모의 생성자에 매개변수를 넘기는 방법



만약에 부모의 클래스에 같은 이름의 메소드가 존재한다면?



첫번째 부모의 func가 호출됨을 확인할 수 있다.

메소드가 사용되어 질때 첫번째 메소드부터 순차적으로 검색함을 확인 할 수 있다.

이를 해결하려면 결국 자식 클래스(다중상속을 받은 클래스)에서 교통정리를 해줘야 한다.


자식에 메소드를 추가해 보자





블로그 이미지

뚱땡이 우주인

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

파이썬에서는 동일 scope 안에 같은 이름 변수 함수등을 선언 할 수는 있지만 마지막에 선언된 것이 덮어쓰게 된다


위 예제를 실행해보면,


def add(self, num1, num2): 함수가 없어서 에러가 발생이 된다.

이를 해결하기 위해서는 가변인자를 활용하면 된다.
* 참고로 가변인자는 인자 앞에 '*' 를 붙이면 된다.


블로그 이미지

뚱땡이 우주인

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

상속을 하는 이유

 - 기존의 설계를 바틍으로 추가된 부분만 만들기 대문에 바르게 만들 수 있다. 이를 재사용(reuse)이라 하며, 생산성과도 관련이 있다.

 - 기존의 설계가 안정적이면 이를 바탕으로 만드는 것이 안정성을 보장 받을 수 있다.


문법

class 클래스_이름(기본_클래스):

   클래스_본체


* 파이썬에서는 다중 상속을 지원한다.

 - 기본_클래스 위치에 콤마(,)를 구분자로 나열하면 된다.


먼저 잘못된 상속을 살펴보자

 

결과 값


위 예제를 보면 color 속성은 접근이 가능하지만 부모의 speed 속성을 접근하려고 하면 에러가 발생이 된다.


* 파이썬에서는 자식의 인스턴스를 만들때 부모의 인스턴스가 자동으로 만들어지지 않는다

정말 그런지 확인 해보자




__dict__ 모듈속성을 이용하여 살펴보면 _color 속성만 있는것을 확인 할 수 있다.



그러면 위 예제를 다시 보자 main을 보면 start() 를 호출 하고 나면 _speed 속성이 추가 된것을 확인 할 수 있다

왜 _speed가 추가 되었을까?


Car의 start 메소드를 확인해보자


start의 self는 무었을 의미할가?

바로 my_sportcar 를 의미한다.

그러면 _speed = 20 은???? 파이썬은 동적 속성 추가가 가능하다..

결국 이 code에서 _speed 속성이 동적으로 추가가 되는 것이다


결국 이 문제를 해결 하기 위해서는,

Car의 인스턴스를 생성해야 하는데 이를 위해서는 자식의 생성자에서 부모의 생성자를 명시적으로 호출 해줘야 한다.




super() 를 이용하여 부모의 생성자를 호출하면 위와 같이 속성에 _speed값이 들어 있는것을 확인 할 수 있다.


업그레이드 버전(최종) - 오버라이딩 포함


블로그 이미지

뚱땡이 우주인

,