[ Python 3 ] 클래스의 Super( ) 에 대해 제대로 알아보자! ( super().__init__(), super()의 위치)
[ 이전 글 ]
클래스(Class)를 제대로 알아보자! (인스턴스 속성, 클래스 속성, 메소드)
클래스 상속(inheritance)을 제대로 알아보자!
[ super( )의 역할 ]
앞선 두 글을 모두 읽고 왔다는 것을 전제로 작성합니다.
super() 라는 함수는 super class 즉, 부모클래스의 임시적인 객체를 반환하여 부모클래스의 메소드를 사용할 수 있게 하는 것 입니다.
아주 중요한 개념입니다!!
잘 이해가 안되실 수도 있는데 이전 글의 마지막 예시를 통해보죠.
우리는 이전 예시에서 "부모 클래스의 인스턴스 속성은 자식 클래스에 상속되지 않는다" 는 걸 알았습니다.
왜 상속되지 않은걸까요??
인스턴스 속성이 언제 생기는지를 생각해보면 간단해 집니다.
위의 예시에서 부모 클래스의 인스턴스 속성은 부모 클래스 객체가 형성될때 __init__ 매직 메소드가 실행되면서 생성 될 것입니다.
그러나 자식 클래스 어디에도 부모 클래스의 객체가 형성된 적이 없지요.
그래서 super()라는 함수를 이용하여 부모 클래스의 __init__() 매직 메소드를 자식 클래스에 실행시키면 문제가 해결됩니다!!
그것이 바로 super().__init__() 의 사용 이유입니다.
[ super().__init__() 의 역할 ]
부모 클래스의 __init__() 매직 메소드를 자식 클래스의 __init__() 매직 메소드에서 실행 한다 고 생각하시면 됩니다.
즉, 자식 클래스에도 부모 클래스의 인스턴스 속성과 동일한 속성이 생성되는 것입니다.
class Human:
""" Super Class """
def __init__(self):
# instance 속성!!
self.name = '사람이름'
self.age = '나이'
self.city = '사는도시'
def show(self):
print('사람 클래스의 메소드입니다.')
class Student(Human):
""" Child Class """
def __init__(self,name):
super().__init__()
self.name = name
def show_name(self):
print('사람의 이름은 : ',self.name)
def show_age(self):
print('사람의 나이는 : ',self.age)
a = Student('james')
a.show() # 메소드 상속
a.show_age() # 인스턴스 속성 상속
a.show_name() # 자식노드에서 속성을 변경
[ super().부모클래스의 메소드() ]
위의 내용을 일반화하면 부모 클래스의 메소드를 자식 클래스에서 직접 사용할 수 있게 된다는 점입니다.
위의 예시를 조금 변형하여 부모 클래스에 show_everything 이라는 메소드를 만들었습니다.
그리고 자식 클래스에서는 super().__init__()과 더불어 show_name 자식 클래스 메소드에 super().show_everything() 메소드를 상속하여 사용했습니다.
메소드를 불러와 사용하는 것이지, 부모 클래스의 인스턴스 속성 자체를 변화시키는 것은 아닙니다.
다시말하지만, super()는 임시적으로 부모 클래스의 객체를 실행시켜 메소드를 사용하기 위한 것입니다.
위의 예시를 보면 super().__init__() 의 순서에 따라 초기화 내용이 달라집니다.
self.name = name 이 먼저 업데이트 된 후
super().__init__() 에 의해 임시적인 부모 클래스의 self.name = '사람이름' 으로 다시 바뀌게 됩니다.
[ 다음 글]
super(클래스, self).__init__() 에 대해 제대로 알아보자!!
'컴퓨터 언어 > Python' 카테고리의 다른 글
[ Python 3 ] Magic Methods 다루기 - 1. 생성, 초기화 ( __new__, __init__, __del__ ) (0) | 2022.08.17 |
---|---|
[ Python 3 ] super(클래스, self).__init__() 에 대해 제대로 알아보자!! (0) | 2022.08.15 |
[ Python 3 ] 클래스 상속(inheritance)을 제대로 알아보자! (0) | 2022.08.15 |
[ Python 3 ] 클래스(Class)를 제대로 알아보자! (인스턴스 속성, 클래스 속성, 메소드) (2) | 2022.08.14 |
[ Python 3 ] 파이썬에선 정수 메모리를 어떻게 사용하는가? (0) | 2022.08.14 |