클래스의 상속 예제 관련 질문
조회수 722회
다음 코드가 동작하도록 자전차 클래스를 정의하세요. 단 자전차 클래스는 차 클래스를 상속받습니다.
bicycle = 자전차(2, 100)
bicycle.가격
100
이 문제의 답안은
class 차:
def __init__(self, 바퀴, 가격):
self.바퀴=바퀴
self.가격=가격
class 자전차(차):
def __inif__(self, 바퀴, 가격):
self.바퀴=바퀴
self.가격=가격
인데, 여기서 상속받은 클래스 자전차가 왜 다시 self.바퀴와 self 가격을 받는지 알고 싶습니다. 그냥
class 차:
def __init__(self, 바퀴, 가격):
self.바퀴=바퀴
self.가격=가격
class 자전차(차):
def __inif__(self):
print(self.가격)
이렇게 하면 안되는건지 궁금합니다.
1 답변
-
파이썬의 class에서
self.XXX
형태로 선언하는 것들은 인스턴스 변수에 해당합니다.해당 클래스의 인스턴스가 생성되었을 때 동일한 클래스의 다른 인스턴스들과 무관하게 그 인스턴스가 고유하게 갖는 변수입니다.
이 변수는 미리 정해진 값이 아니고 전달받는 값에 따라 정해지는 값입니다.
작성하신 코드를 보면
차
라는 클래스는 인스턴스를 선언할 때 바퀴와 가격에 해당하는 값들을 매개변수로 받아서 각각을 인스턴스 변수로 저장하고 있습니다.클래스를 상속받아서 새로운 클래스를 만들었는데 매개변수를 전달하지 않으면 당연히 그 매개변수를 받아 값을 저장하는 부분을 수행할 수 없게 되고, 자연히 값을 불러오는 코드 역시 수행할 수 없게 됩니다.
대신 상속받은 클래스의
__init__
이 하는 일을 굳이 반복해서 쓰지 않아도 아래와 같은 방법으로 동일한 과정을 수행할 수 있습니다.class 차: def __init__(self, 바퀴, 가격): self.바퀴=바퀴 self.가격=가격 class 자전차(차): def __inif__(self, 바퀴, 가격): super(자전차, self).__init__(바퀴, 가격)
- 즉, 상속받는 클래스인 자전차에서 다시 인스턴트 변수를 받게 만들어 주지 않으면, 실행되는 것은 "차" 클래스에 입력된 변수를 바탕으로 하는 것이기에, "자전차" 클래스에 적용되는 변수를 입력받을 수 있게 만들어 주어야 한다는 말씀이신가요? Hin 2021.8.7 15:50
- 클래스 상속에서 __init__을 선언하지 않고 그 외의 다른 method만 선언한다면 부모 클래스의 __init__을 그대로 상속받기는 합니다. 하지만 일반적으로는 __init__을 새로 선언해주거나 __init__ 안에서 super를 사용해 주어야 합니다. 올려주신 코드의 경우 두 클래스가 하는 일은 완전히 동일한데, 아무것도 오버라이딩 하지 않으면 클래스를 선언할 수 없기 때문에 __init__을 반복해서 적어준 것 아닌가 싶습니다. 적절한 비유인지는 모르겠습니다만 중고등학교 체육시간에 멀리뛰기 같은 걸 한다고 했을 때 뛰는 것 자체는 앞 학생과 똑같이 하면 되지만 뛰기 전에 본인 이름을 말해야 하는 것과 비슷하다고 할 수 있겠네요. 뛰는 것 자체는 각 클래스가 하는 일이라고 한다면 각자의 이름이 인스턴스 변수에 해당한다고 생각하시면 됩니다. HIAOAIH 2021.8.9 09:47
- 답변해 주셔서 감사합니다. Hin 2021.8.9 15:52
댓글 입력