티스토리 뷰
📌 상속
자식 클래스가 부모 클래스로부터 멤버 변수와 멤버 메서드를 물려받는 것을 말한다. 부모 클래스에게서 상속받은 메서드를 자식 클래스에서 기능을 확장(오버 라이딩)할 수 있다. 클래스 내부의 메서드가 기능이 구현되어 있지 않은 추상 메서드인 경우 추상 클래스라고 하며, 이를 상속받은 자식 클래스는 반드시 추상 메서드를 구현해주어야 한다.
📍 자식 클래스가 부모 클래스로부터 멤버를 상속받는다.
📍 부모 클래스로부터 상속받은 메서드를 재 정의하는 것을 오버 라이딩이라고 한다.
📍 부모 클래스의 멤버를 사용하려면 super(). 멤버명으로 접근할 수 있다.
📍 부모 클래스의 인스턴스 멤버에는 당연히 접근 불가능.
📍 기능이 구현되어 있지 않은 빈껍데기 메서드를 추상 메서드라고 한다.
📍 추상 메서드를 가진 클래스를 상속한 자식 클래스는 반드시 추상 메서드를 구현해 주어야 한다.
📍 [참고] 파이썬을 갈고 닦자! : wikidocs.net/16073
👉 상속
class Greet() :
greet = 'hello'
introduce = 'My name is'
def greeting(self) :
print('Nice to Meet you')
def print_info(self) :
print(Greet.introduce,end=' ')
#상속하고자 하는 클래스명을 소괄호에 넣는다
class Profile(Greet) :
def __init__(self, name) :
self.name=name
#메인 루틴
if __name__ == '__main__' :
s1 = Profile('jjangu')
print(s1.greet) # hello
s1.print_info() # My name is jjangu
s1.greeting() # Nice to Meet you
✔ 상속하고자 하는 부모 클래스의 이름을 클래스를 정의할 때 소괄호에 넣어준다.
✔ 자식 클래스가 갖고 있지 않은 멤버라도 부모 클래스가 갖고 있다면 자식 클래스 객체를 통해 사용 가능하다.
✔ 자식 클래스 Profile은 메서드 greeting, print_info를 가지고 있지 않지만 상속받았기에 사용할 수 있다.
👉 메서드 오버 라이딩과 super( )
class Greet() :
greet = 'hello'
introduce = 'My name is'
def greeting(self) :
print('Nice to Meet you')
def print_info(self) :
print(Greet.introduce,end=' ')
#상속하고자 하는 클래스명을 소괄호에 넣는다
class Profile(Greet) :
def __init__(self, name) :
self.name=name
#오버 라이딩 : 부모 클래스의 함수 재정의
def print_info(self) :
super().print_info()
print('{}'.format(self.name))
#메인 루틴
if __name__ == '__main__' :
s1 = Profile('jjangu')
print(s1.greet) # hello
s1.print_info() # My name is jjangu
s1.greeting() # Nice to Meet you
✔ 부모 클래스가 가진 메서드를 자식 클래스에서 재 정의하는 것을 오버 라이딩이라고 한다.
✔ 재정의하기 전의 메서드를 자식 클래스 내부에서 사용하고 싶다면 super()를 사용한다.
✔ super()는 메서드뿐만 아니라 부모 클래스의 멤버에 접근할 수 있다.
class A :
__a = 'a_private value'
def __init__ (self, a) :
self.a = a
def print_instance(self) :
print(self.a)
def print_private(self) :
print(A.__a)
class B(A) :
def __init__(self, b):
self.b = b
#main
aa = A('a_instance_value')
aa.print_instance()
aa.print_private()
bb = B('b_instance_value')
# bb.print_instance() #Error
bb.print_private()
✔ 클래스가 공유하지 못하는 인스턴스 변수에는 접근할 수 없다.
✔ 즉, 인스턴스 변수를 사용하는 메서드는 오버 라이딩하거나 super()를 통해 사용할 수 없다.
✔ private 멤버 역시 클래스 내부에서만 사용할 수 있으므로 상속받을 수 없다.
✔ 하지만 메서드를 간접 접근을 통해서는 사용할 수 있다. 그러므로 private 멤버를 사용하는 메서드는 사용할 수 있다.
👉 다중 상속
class A() :
def func(self) :
print('A')
class B() :
def func(self) :
print('B')
#다중 상속
class C(A,B) :
def func(self) :
#이 때 호출되는 함수는?
super().func()
print('C')
if __name__ == '__main__' :
c = C()
c.func()
✔ 다중 상속은 자식 클래스 하나가 여러 클래스로부터 상속받는 것을 의미한다.
✔ 여러 개의 클래스를 콤마를 사용해 한번에 상속받을 수 있다.
✔ 만약 같은 이름의 메서드를 가진 여러 클래스를 상속받았을 때, 어떤 메서드를 사용할까?
✔ 그럴 때에는 먼저 상속한 부모 클래스의 메서드를 사용한다.
👉 추상 메서드와 추상 클래스
✔ 추상 메서드 : 자식 클래스에서 오버 라이딩하도록 부모 클래스에서는 pass로 채워둔 메서드
✔ 추상 클래스 : 미구현 추상 메서드를 하나 이상 가지는 클래스
from abc import ABCMeta
from abc import abstractmethod
class 추상클래스명(metaclass=ABCMeta):
@abstractmethod
def 추상메서드(self):
pass
class 자식클래스(추상클래스명) :
def 추상메서드(self) :
print('상속받은 추상메서드 구현')
✔ 추상 클래스를 만들기 위해서는 반드시 abc 모듈을 import 해야 한다.
✔ 추상 클래스의 소괄호에는 metaclass=ABCMeta를 넣어 추상 클래스임을 알리고
✔ 메서드는 @abstractmethd를 사용해 추상 메서드임을 명시한다.
from abc import ABCMeta
from abc import abstractmethod
#추상 클래스
class Person(metaclass=ABCMeta) :
#추상 메서드
@abstractmethod
def greeting(self) :
pass
#추상 클래스를 상속하는 자식 클래스
class Profile(Person) :
def greeting(self) :
print('HELLO!')
#main 루틴
if __name__ =='__main__' :
p = Profile()
p.greeting() #HELLO!
✔ 추상 클래스를 상속받은 자식 클래스는 반드시 추상 메서드를 구현해야 한다.
✔ 상속받은 추상 메서드를 구현하지 않으면 객체 생성 시 에러가 발생한다.
👉 mor( ) : 상속 관계를 확인하는 내장 함수
# 부모 클래스 : Person
# 자식 클래스 : Profile
print(Person.mro())
print(Profile.mro())
✔ 내장 함수 mro( )을 사용해 클래스의 상속 관계를 확인할 수 있다.
✔ object 클래스는 모든 클래스의 최상위 클래스로, 모든 클래스가 object를 상속한다.
✔ 객체가 아닌 클래스명에 직접 사용하니 주의하자.
[참고] 엘리스 트랙-혼자 공부하는 파이썬 / 길벗-파이썬 코딩 도장 / 엘리스 트랙 - 예제 중심의 파이썬 입문 / 위키백과
'BackEnd > Python' 카테고리의 다른 글
[파이썬 기초] 06-1. 이터레이터와 제너레이터 (0) | 2021.03.24 |
---|---|
[파이썬 기초] 05-4. 데코레이터 (0) | 2021.03.24 |
[파이썬 기초] 05-2. 특수 메서드 (매직 메서드) (0) | 2021.03.23 |
[파이썬 기초] 05-1. 객체와 클래스 (0) | 2021.03.23 |
[파이썬 기초] 03-1. 내장 함수 사용하기(o-z) (0) | 2021.03.22 |