
임의 클래스는 다른 클래스의 어트리뷰트(변수나 메서드 등등)를 상속받을 수 있다.
예를 들어 아래의 <코드 1>에서 MyClass2는 MyClass1을 상속한다.
그로 인하여 MyClass2의 인스턴스 my_class2는 MyClass1 클래스에 정의되어 있는 tell_out_world 메서드를 사용할 수 있다.
<코드 1>
class MyClass1:
def tell_out_world(self):
print('Hello Python!')
class MyClass2(MyClass1):
pass
my_class2 = MyClass2()
my_class2.tell_out_world()

아래의 <코드 2>에서 처럼 MyClass2 클래스의 인스턴스 my_class2가 생성될 때 MyClass1 클래스의 __init__ 메서드 (생성자)가 호출되어 my_class2는 MyClass1 클래스의 number 변수도 사용 가능하다.
<코드 2>
class MyClass1:
def __init__(self):
self.number = '100'
def tell_out_world(self):
print('Hello Python!')
class MyClass2(MyClass1):
pass
my_class2 = MyClass2()
print(my_class2.number)

아래의 <코드 3>에서 처럼 임의 클래스를 상속받는 클래스(서브 클래스 또는 Child 클래스)는 자신 만의 어트리뷰트를 가질 수 있다.
<코드 3>
class MyClass1:
def __init__(self):
self.number = '100'
def tell_out_world(self):
print('Hello Python!')
class MyClass2(MyClass1):
def what_i_do(self):
print('Python Programming')
my_class2 = MyClass2()
my_class2.what_i_do()

아래의 <코드 4>는 임의 클래스(베이스 클래스 또는 Parent 클래스)를 상속받는 서브 클래스는 베이스 클래스의 어트리뷰트를 재정의 할 수 있음을 보여 준다.
<코드 4>
class MyClass1:
def __init__(self):
self.number = '100'
def tell_out_world(self):
print('Hello Python!')
class MyClass2(MyClass1):
def __init__(self):
self.number = 1000
def tell_out_world(self):
print('Hello World')
my_class2 = MyClass2()
print(my_class2.number)
my_class2.tell_out_world()

아래의 <코드 5>는 서브 클래스에서 __init__ 메서드를 포함한 베이스 클래스의 어트리뷰트에 접근하는 몇 가지 방법에 대하여 보여 준다.
<코드 5>
class MyClass1:
def __init__(self):
self.number = '100'
def tell_out_world(self):
print('Hello Python!')
class MyClass2(MyClass1):
def __init__(self):
self.number = 1000
def tell_out_world(self):
super().tell_out_world()
super(MyClass2, self).tell_out_world()
MyClass1.tell_out_world(self)
print('Hello World')
my_class2 = MyClass2()
my_class2.tell_out_world()
위의 코드에서 처럼 서브 클래스는 베이스 클래스의 메서드는 다음의 세 가지 방식 중 하나를 이용해 접근할 수 있다.
super().tell_out_world()
super(MyClass2, self).tell_out_world()
MyClass1.tell_out_world(self)

isinstance() & issubclass()
함수 isinstance 나 issubclass는 클래스의 상속 관계를 확인할 때 사용할 수 있다.
<코드 6>
class MyClass1:
pass
class MyClass2(MyClass1):
pass
my_class1 = MyClass1()
my_class2 = MyClass2()
print(isinstance(my_class1, MyClass1))
print(isinstance(my_class2, MyClass1))
print(isinstance(my_class1, MyClass2))
print()
print(issubclass(MyClass1, MyClass1))
print(issubclass(MyClass2, MyClass1))
print(issubclass(MyClass1, MyClass2))

클래스의 다중 상속
파이썬은 클래스의 다중 상속을 지원한다.
<코드 7>
class BaseClass1:
def i_am_base_class(self):
print('base class 1')
class BaseClass2:
def i_am_base_class(self):
print('base class 2')
class BaseClass3:
def i_am_base_class(self):
print('base class 3')
class SubClass(BaseClass1, BaseClass2, BaseClass3):
def __init__(self):
super().i_am_base_class()
super(SubClass, self).i_am_base_class()
BaseClass1.i_am_base_class(self)
BaseClass2.i_am_base_class(self)
BaseClass3.i_am_base_class(self)
sub_class = SubClass()
파이썬 내장 클래스인 super()로는 첫번째로 정의한 베이스 클래스인 BaseClass1의 i_am_base_class 메서드만 호출된다.

'코딩 > 파이썬 기초' 카테고리의 다른 글
| 파이썬 튜토리얼 044. shutil 라이브러리의 copyfile 함수로 파일 복사 (0) | 2021.09.15 |
|---|---|
| 파이썬 튜토리얼 043. Iterators와 Generators에 대한 예제 (0) | 2021.09.11 |
| 파이썬 튜토리얼 041. 클래스 정의 및 클래스 attributes (0) | 2021.08.24 |
| 파이썬 튜토리얼 040. global, nonlocal 키워드를 통한 namespace 이해 (0) | 2021.08.20 |
| 파이썬 튜토리얼 039. 오류 처리를 위한 try, except, else, finally 문 그리고 raise 문 (0) | 2021.08.14 |