파이썬 클래스 상속 __init__ - paisseon keullaeseu sangsog __init__

클래스 생성자 __init__ 을 자식 클래스에서 상속받을 때 값을 추가하거나 수정하는 것에 대해서 알아보자.

카페를 운영하는데 커피를 원두 별로 구분해 특성을 기입한다고 하자. 클래스의 매개변수를 커피콩의 원산지, 콩의 양(kg), 산도, 신맛 이렇게 4개로 하는 클래스를 만들었다.

우리 매장에 들어오는 많은 원두가 인도네시아산이어서 기본값은 인도네시아로 설정하고, 기본 10kg단위가 많아 10kg로 설정했다. 산도와 탄맛도 이와같다.

값을 입력했으면, 위의 Coffee함수를 이어받아 원두를 평가할 함수를 만들어보자.

새로운 함수 Evaluate를 만들어 Coffee함수를 상속받아왔다.

역기서

def __init__()

이 안에 들어가는 인자들은 1)self 및 , 2)자식클래스에 물려받아오고 싶은 부모클래스의 인자, 3)자식클래스에서 더 추가하고 싶은 인자 이다.

다시말해 부모클래스와 다른 Evaluate 클래스에서 구성하고 싶은 인자들을 적어주면 된다. 그렇기 때문에, 자식클래스에서 수정하고 싶은 디폴트 값이 있으면, 여기서 수정해주면 된다.

위의 예시와 같이 부모클래스에서 기본값을 설정해두었는데, Evaluate에서는 다른 기본값을 가지고 오고 싶다면 def __init__()내에서 수정할 수 있다.

또한, 더 추가하고 싶은 인자, 여기서는 price도 추가할 수 있다. 밑에 self.price = price라고 하나의 변수를 더 생성해준다.

super().__init__()

이 부분은 부모클래스를 상속받는 부분이다.

매우 정리가 잘 된 블로그 글:

//elvanov.com/981

안녕하세요. 이번 시간에는 파이썬에서 클래스를 다룰 때,

상속을 진행하는 경우의 원리와 예제,

그리고 super().__init__() 함수가 의미하는 바가 무엇인지에 대하여

살펴는 시간을 가져보겠습니다.

가장 많이 다루는 클래스 상속 예제인 Person과 Student의 관계를 가지고

이 글에서도 설명해보도록 하겠습니다.

우선, 다음과 같은 간단하게 구현된 Person 클래스가 있다고 가정하겠습니다.

class Person: def __init__(self, name, age): self.name = name self.age = age def get_name(self): print(f'제 이름은 {self.name}입니다.') def get_age(self): print(f'제 나이는 {self.age}세 입니다.')

name과 age 두 가지의 속성을 가지며,

이름과 나이를 출력할 수 있는 두 가지 메소드를 가진 간단한 형태의 클래스입니다.

클래스를 호출하고 메소드를 실행시키는 예제는 다음과 같습니다.

person_a = Person('김OO', 27) person_a.get_name() # 제 이름은 김OO입니다. person_a.get_age() # 제 나이는 27세 입니다.

이제, 이 사람이 대학생이라고 가정을 해보고, GPA라는 새로운 속성

추가로 부여하는 상황을 살펴보겠습니다.

만일, Student라는 클래스를 별개로 구현한다면, 다음과 같이 나타낼 수 있습니다.

class Student: def __init__(self, name, age, GPA): self.name = name self.age = age self.GPA = GPA def get_name(self): print(f'제 이름은 {self.name}입니다.') def get_age(self): print(f'제 나이는 {self.age}세 입니다.') def get_GPA(self): print(f'제 학점은 {self.GPA}입니다.')

그러나 위와 같은 경우, Person 클래스에서 사용했던 name과 age 속성,

그리고 get_name과 get_age 메소드를 중복해서 작성하고 있는

상황이 펼쳐지고 있습니다.

만일, 다른 직업에 대한 클래스를 Person 클래스의 정보를 포함하여

새롭게 구현해야 상황에도 같은 작업이 반복되는 것은 낭비인 듯 합니다.

따라서, 이와 같은 경우 중복된 속성과 메소드를 쉽게 포함시킬 수 있게 해주는 기능이

클래스의 상속입니다. 이제 이에 대한 예제를 아래에서 살펴보겠습니다.

파이썬 클래스 상속 방법 : super().__init__()

super().__init__()이라는 코드가 다른 클래스의 속성 및 메소드

자동으로 불러와 해당 클래스에서도 사용이 가능하도록 해줍니다.

Student 클래스에서 Person 클래스의 속성 및 메소드를 가져오는 경우를

가정해보겠습니다. 아래와 같이 코드가 간소화된 것을 확인하실 수 있습니다.

class Student(Person): def __init__(self, name, age, GPA): super().__init__(name, age) self.GPA = GPA def get_GPA(self): print(f'제 학점은 {self.GPA}입니다.')

클래스 선언 시에 Student(Person)처럼 상속할 부모 클래스의 이름을

괄호 내에 적어주시면 됩니다.

초기화 단계에서 부모 클래스의 __init__ 메소드를 호출하는 원리로 진행됩니다.

그리고, 부모 클래스에 전달할 input을 super().__init__() 내에 적어주시면 됩니다.

get_age, get_name 함수가 Student 클래스 객체 내에 잘 포함되었는지를

확인해보도록 하겠습니다.

student_a = Student('김OO', 27, 3.4) student_a.get_name() # 제 이름은 김OO입니다. student_a.get_age() # 제 나이는 27세 입니다. student_a.get_GPA() # 제 학점은 3.4입니다.

새롭게 구현한 get_GPA까지 세 가지 메소드가 모두 정상 실행되고 있는 것을

알 수 있었습니다.

부모 클래스와 다른 메소드 사용하기

때로는 메소드 이름은 같지만, 부모 클래스와 다른 기능을 하는 메소드를

구현하고 싶은 경우가 있을 것입니다.

이 경우에는, 상속받은 클래스 내에서 해당 메소드를 새롭게 다시 구현해주면

다른 기능을 수행하도록 만들 수 있습니다.

class Student(Person): def __init__(self, name, age, GPA): super().__init__(name, age) self.GPA = GPA def get_name(self): print(f'저는 대학생 {self.name}입니다.') def get_GPA(self): print(f'제 학점은 {self.GPA}입니다.')

get_name 메소드를 부모 클래스에서와는 다른 메시지가 출력되도록

설정해보았습니다. 결과를 확인해보면 아래와 같습니다.

student_a = Student('김OO', 27, 3.4) student_a.get_name() # 저는 대학생 김OO입니다.

바뀐 메소드의 출력 결과가 정상적으로 반영된 것을 확인할 수 있었습니다.

부모 클래스의 메소드 호출하기 : super() 이용

마지막으로, 부모 클래스에서 구현했던 메소드를 호출하는 예제를 살펴보겠습니다.

get_name을 자식 클래스에서 새롭게 구현했음에도,

부모 클래스에서 구현되었던 get_name을 호출해보는 경우입니다.

get_GPA 함수 내에서 Student 클래스의 get_name이 아닌

Person 클래스의 get_name이 호출되고 있음을 보았습니다.

부모 클래스의 메소드를 호출하는 경우는 super().메소드이름 형태

코드를 작성해주시면 됩니다.

Toplist

최신 우편물

태그