본문 바로가기

코딩/파이썬 기초

파이썬 튜토리얼 042. 클래스의 상속과 supper 클래스

임의 클래스는 다른 클래스의 어트리뷰트(변수나 메서드 등등)를 상속받을 수 있다.

 

예를 들어 아래의 <코드 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 메서드만 호출된다.