AboutPython
[파이썬] 생성자, __init__() 호출, super()
scone
2022. 5. 4. 00:32
[생성자]
- 객체가 생성될 때 생성자를 호출하면 __init__()이 자동 호출 된다.
- 실습을 통해 이를 직접 눈으로 확인하도록 하자.
class Calculator :
def __init__(self):
print('계산기에 __init__ 메소드가 호출되었습니다.')
cal = Calculator()
'''
계산기에 __init__ 메소드가 호출되었습니다.
'''
생성자 Calculator을 호출하자 __init__()이 자동 호출 됐음을 볼 수 있다.
- __init__()가 속성을 초기화 한다.
class Calculator :
def __init__(self,n1,n2):
print('계산기에 __init__ 메소드가 호출되었습니다.')
self.num1 = n1 # 매개 변수를 받아서 값을 초기화했다.
self.num2 = n2
cal = Calculator(10,20) # 매개변수를 넣는다.
print(f'num1 은 {cal.num1}')
print(f'num2 은 {cal.num2}')
'''
계산기에 __init__ 메소드가 호출되었습니다.
num1 은 10
num2 은 20
'''
물론 매개변수를 받지 않고 함수 내에서 임의로 값을 넣어 초기화 하여도 된다.
def __init__(self) :
self.num1 = 10
self.num2 = 20
이런 식으로
[super()]
- 상위 클래스의 속성을 초기화 하기 위해 super() 을 사용한다.
아래의 실습 스텝을 통해 찬찬히 이해해보도록 하겠다.
- 부모 클래스와 자식 클래스를 만들어 자식 클래스의 생성자를 호출해보자.
class P_Class :
def __init__(self,pnum1,pnum2):
print('P_Class의 __init__ 메소드가 호출되었습니다.')
self.pnum1 = pnum1 # 매개 변수를 받아서 값을 초기화했다.
self.pnum2 = pnum2
class C_Class(P_Class) :
def __init__(self,cnum1,cnum2):
print('C_Class의 __init__ 메소드가 호출되었습니다.')
self.cnum1 = cnum1
self.cnum2 = cnum2
child = C_Class(10,11)
'''
C_Class의 __init__ 메소드가 호출되었습니다.
'''
자식 클래스의 __init__ 메소드만 호출되는 것을 볼 수 있다. 이는 자식 클래스의 속성만 초기화 됨을 의미한다.
하지만 부모 클래스의 __init__ 메소드는 호출되지 않았기 때문에 부모 클래스의 속성은 쓸 수가 없게 됐다.
- 다음과 같이 자식 클래스의 __init__메소드에 부모 클래스의 __init__메소드를 호출하면, 부모 클래스와 자식 클래스 모두의 속성을 초기화 시킬 수 있다.
class P_Class :
def __init__(self,pnum1,pnum2):
self.pnum1 = pnum1 # 매개 변수를 받아서 값을 초기화했다.
self.pnum2 = pnum2
print('P_Class의 __init__ 메소드가 호출되었습니다.')
class C_Class(P_Class) :
def __init__(self,cnum1,cnum2):
P_Class.__init__(self,cnum1,cnum2) # self를 포함한 매개 변수를 빠트리지 않음에 유의한다.
self.cnum1 = cnum1
self.cnum2 = cnum2
print('C_Class의 __init__ 메소드가 호출되었습니다.')
child = C_Class(10,11)
'''
P_Class의 __init__ 메소드가 호출되었습니다.
C_Class의 __init__ 메소드가 호출되었습니다.
'''
- 조금 더 세련된 방법이 있다. super()를 이용한 방법이다.
class P_Class :
def __init__(self,pnum1,pnum2):
self.pnum1 = pnum1 # 매개 변수를 받아서 값을 초기화했다.
self.pnum2 = pnum2
print('P_Class의 __init__ 메소드가 호출되었습니다.')
class C_Class(P_Class) :
def __init__(self,cnum1,cnum2):
super().__init__(cnum1,cnum2) #self를 써주지 않아도 된다.
self.cnum1 = cnum1
self.cnum2 = cnum2
print('C_Class의 __init__ 메소드가 호출되었습니다.')
child = C_Class(10,11)
'''
P_Class의 __init__ 메소드가 호출되었습니다.
C_Class의 __init__ 메소드가 호출되었습니다.
'''
부모 클래스의 클래스 명 대신 super()를 쓸 경우, 매개변수에 self를 더 이상 써주지 않아도 됨에 유의하자.
[실습] 중간고사 클래스와 기말고사 클래스를 상속관계로 만든 후 총점과 평균을 구하는 프로그램을 만들어보자.
class Midterm :
def __init__(self,s1,s2,s3):
print('Midterm __init__()')
self.mid_kor = s1
self.mid_eng = s2
self.mid_math = s3
def print_score(self):
print(f'중간 국어점수 : {self.mid_kor}')
print(f'중간 영어점수 : {self.mid_eng}')
print(f'중간 수학점수 : {self.mid_math}')
class EndExam(Midterm):
def __init__(self,s1,s2,s3,s4,s5,s6):
print('EndExam __init__()')
super().__init__(s1,s2,s3)
self.end_kor = s4
self.end_eng = s5
self.end_math = s6
def print_score(self):
super().print_score()
print(f'기말 국어점수 : {self.end_kor}')
print(f'기말 영어점수 : {self.end_eng}')
print(f'기말 수학점수 : {self.end_math}')
def get_total_score(self):
total = self.mid_kor+self.mid_eng+self.mid_math
total += self.end_kor+self.end_eng+self.end_math
return total
def get_avg_score(self):
return self.get_total_score() / 6
end_exam = EndExam(85,90,75,83,90,95)
end_exam.print_score()
print(f'전체 총점 : {end_exam.get_total_score()}')
print(f'전체 평점 : {end_exam.get_avg_score()}' )
'''
EndExam __init__()
Midterm __init__()
중간 국어점수 : 85
중간 영어점수 : 90
중간 수학점수 : 75
기말 국어점수 : 83
기말 영어점수 : 90
기말 수학점수 : 95
전체 총점 : 518
전체 평점 : 86.33333333333333
'''