Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 클래스 상속 완벽 가이드: 기본 문법부터 다중 상속까지

파이썬에서는 처음부터 모든 코드를 새로 작성하는 대신, 기존에 존재하는 클래스를 기반으로 새로운 클래스를 파생시켜 만들 수 있습니다. 새 클래스 이름 뒤 괄호 안에 부모 클래스를 나열하기만 하면 됩니다.

이렇게 만든 자식 클래스는 부모 클래스의 속성과 메서드를 그대로 물려받으며, 마치 자식 클래스 내부에서 직접 정의한 것처럼 자유롭게 사용할 수 있습니다. 또한 필요에 따라 부모 클래스의 데이터 멤버나 메서드를 재정의(오버라이드)할 수도 있습니다.

상속 문법

파생 클래스는 일반 클래스와 거의 같은 방식으로 선언합니다. 다만 클래스 이름 뒤에 상속받을 기반(부모) 클래스의 목록을 명시한다는 점이 다릅니다.

class SubClassName(ParentClass1[, ParentClass2, ...]):
    '선택적인 클래스 문서화 문자열'
    class_suite

예제

다음 예제는 부모 클래스 Parent를 상속받아 자식 클래스 Child를 정의하고, 부모의 속성과 메서드를 함께 사용하는 모습을 보여줍니다.

#!/usr/bin/python3
class Parent:  # 부모 클래스 정의
    parentAttr = 100

    def __init__(self):
        print("부모 생성자 호출")

    def parentMethod(self):
        print('부모 메서드 호출')

    def setAttr(self, attr):
        Parent.parentAttr = attr

    def getAttr(self):
        print("부모 속성 :", Parent.parentAttr)

class Child(Parent):  # Parent를 상속받는 자식 클래스 정의
    def __init__(self):
        print("자식 생성자 호출")

    def childMethod(self):
        print('자식 메서드 호출')

c = Child()          # 자식 클래스의 인스턴스 생성
c.childMethod()      # 자식이 자신의 메서드 호출
c.parentMethod()     # 부모에게서 상속받은 메서드 호출
c.setAttr(200)       # 부모의 메서드를 통해 속성 변경
c.getAttr()          # 변경된 속성 값 확인

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

자식 생성자 호출
자식 메서드 호출
부모 메서드 호출
부모 속성 : 200

실행 결과에서 알 수 있듯이, 자식 클래스의 인스턴스는 별도의 추가 코드 없이도 부모 클래스의 메서드(parentMethod, setAttr, getAttr)를 그대로 호출할 수 있습니다.

다중 상속

파이썬은 하나의 클래스가 여러 부모 클래스로부터 동시에 상속받는 다중 상속도 지원합니다. 괄호 안에 부모 클래스를 쉼표로 구분하여 나열하면 됩니다.

class A:  # 클래스 A 정의
    .....

class B:  # 클래스 B 정의
    .....

class C(A, B):  # A와 B를 모두 상속받는 하위 클래스
    .....

다중 상속 시 여러 부모 클래스에 같은 이름의 메서드가 있다면, 파이썬은 메서드 결정 순서(MRO, Method Resolution Order)에 따라 탐색 순위가 앞선 부모 클래스의 메서드를 우선적으로 사용합니다.

클래스 관계 확인하기

issubclass() 또는 isinstance() 함수를 사용하면 두 클래스 간의 관계, 혹은 인스턴스와 클래스 간의 관계를 손쉽게 확인할 수 있습니다.

  • issubclass(sub, sup): 주어진 하위 클래스 sub가 실제로 슈퍼클래스 sup의 하위 클래스라면 True를 반환하는 불리언 함수입니다.
  • isinstance(obj, Class): 객체 objClass의 인스턴스이거나, Class를 상속받은 하위 클래스의 인스턴스라면 True를 반환하는 불리언 함수입니다.

이 두 함수를 활용하면 상속 구조를 동적으로 검사할 수 있어, 유연하고 안전한 객체지향 코드를 작성하는 데 큰 도움이 됩니다.