[코딩도장] day25. 파이썬 클래스 상속 사용하기(1/2) - 클래스 상속, super(), 오버라이딩
■ 들어가기
- 파이썬 코딩 도장 (남재윤/길벗). 을 공부하며 정리하는 블로그
▶ Unit36. 클래스 상속 사용하기
- 36.1 사람 클래스로 학생 클래스 만들기
- 36.2 상속 관계와 포함 관계 알아보기
- 36.3 기반 클래스의 속성 사용하기
- 36.4 메서드 오버라이딩 사용하기
- 36.5 다중 상속 사용하기
- 36.6 추상 클래스 사용하기
0. 들어가기
- 클래스 상속?? 상위 클래스로부터 물려받은 기능을 유지한 채 다른 기능을 추가할 때 사용하는 기능
- 물려주는 상위 클래스를 "기반 클래스" (부모 클래스, 슈퍼 클래스라 부르기도 함)
물려받는 하위 클래스를 "파생 클래스" 라 부름 (자식 클래스, 서브 클래스라 부르기도 함)
- 상속은 기존 기능을 재사용할 수 있어서 효율적
( 새로운 기능 필요시 마다 클래스를 만들면 중복되는 부분을 반복해서 만들어야 하기 때문 )
>> 36.1 사람 클래스로 학생 클래스 만들기 <<
- 사용법
class 기반클래스이름 :
코드
class 파생클래스이름(기반클래스이름) :
코드
소스 (class_inheritance.py) | 결과 |
class Person : def greeting(self) : print('안녕하세요.') class Student(Person) : def study(self) : print('공부하기') james = Student() james.greeting() jaems.study() |
안녕하세요. 공부하기 |
- Student 클래스에는 greeting 메서드가 없지만 상속을 통해 greeting 메서드 호출 가능
[참고] 상속 관계 확인하기
- issubclass 함수로 클래스의 상속 관계 확인
- 사용법 : issubclass(파생클래스, 기반클래스)
- 기반 클래스의 파생 클래스가 맞다면 True, 아니면 False 를 반환
>>> class Person : pass >>> class Student(Person) : pass >>> issubclass(Student, Person) True |
>> 36.2 상속 관계와 포함 관계 알아보기 <<
1. 상속 관계 (is-a 관계)
- 상속은 명확하게 같은 종류이며 동등한 관계일 때 사용
- "학생(Student)은 사람(Person)이다."라고 했을 때 말이 되면 동등한 관계임
2. 포함 관계 (has-a 관계)
- 속성에 인스턴스를 넣어 관리
>> 36.3 기반 클래스의 속성 사용하기 <<
소스 (class_inheritance_attribute_error.py) | 결과 |
class Person : def __init__(self) : print('Person __init__') self.hello = '안녕하세요.' class Student(Person) : def __init__(self) : print('Student __init__') self.school = '파이썬 코딩 도장' james = Student() print(james.school) print(james.hello) |
Student __init__ 파이썬 코딩 도장 Traceback (most recent call last): File "C:/project/class_inheritance_attribute_error.py", line 14, in <module> print(james.hello) AttributeError: 'Student' object has no attribute 'hello' |
- 에러 : Student 객체에서 hello 속성 호출 불가
- 원인 : Person 클래스의 __init__ 메서드가 호출되어야 hello 속성 생성되는데, 해당 메서드가 호출되지 않음
1. super()로 기반 클래스 초기화하기
- 위와 같은 경우 super()를 사용해서 기반 클래스(Person)의 __init__ 메서드 호출
- 사용법 : super().메서드()
소스 (class_inheritance_attribute.py) | 결과 |
class Person : def __init__(self) : print('Person __init__') self.hello = '안녕하세요.' class Student(Person) : def __init__(self) : print('Student __init__') super().__init__() # 기반클래스의 __init__ 메서드 호출 self.school = '파이썬 코딩 도장' james = Student() print(james.school) print(james.hello) |
Student __init__ Person __init__ 파이썬 코딩 도장 안녕하세요. |
2. 기반 클래스를 초기화하지 않아도 되는 경우
- 파생 클래스에서 __init__ 메서드를 생략한다면 기반 클래스의 __init__이 자동으로 호출됨
=> super() 사용하지 않아도 됨
소스 (class_inheritance_no_init.py) | 결과 |
class Person : def __init__(self) : print('Person __init__') self.hello = '안녕하세요.' class Student(Person) : pass james = Student() print(james.hello) |
Person __init__ 안녕하세요. |
>> 36.4 메서드 오버라이딩 사용하기 <<
- 오버라이딩?? 파생 클래스에서 기반 클래스의 메서드를 새로 정의하는 방법
소스 (class_method_override.py) | 결과 |
class Person : def greeting(self) : print('안녕하세요.') class Student(Person) : def greeting(self) : print('안녕하세요. 저는 파이썬 코딩 도장 학생입니다.') james = Student() james.greeting() |
안녕하세요. 저는 파이썬 코딩 도장 학생입니다. |
- super() 로 기반 클래스 메서드 호출하기 + 재정의하기
소스 (class_method_overriding_super.py) | 결과 |
class Person : def greeting(self) : print('안녕하세요.') class Student(Person) : def greeting(self) : super().greeting() # 기반 클래스의 메서드 호출 print('저는 파이썬 코딩 도장 학생입니다.') james = Student() james.greeting() |
안녕하세요. 저는 파이썬 코딩 도장 학생입니다. |