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
'''