본문 바로가기

Python 기초

파이썬 기초(15)-상속

*이 글을 읽기전에 작성자 개인의견이 있으니, 다른 블로그와 교차로 읽는것을 권장합니다.*

1. 상속

파이썬에서 상속 한 클래스의 속성과 메서드를 다른 클래스에 전달하는 기능을 의미합니다. 상속을 사용하면 기존의 코드를 재사용하고 확장할 수 있습니다. 기본적으로 파이썬의 모든 클래스는 object라는 기본 클래스로부터 상속받습니다.(기본값이라 표현되지 않을뿐)

# 상속 기본형태
class Parent:
	클래스문 코드
class Child(parent):
	pass

 

상속의 구조

#상속
class Anime:
    def __init__(self,a,b):
        self.a=a
        self.b=b
    def health(self,sports):
        print(f'{self.a}는 {sports}이용')

    def eat(self,food):
        print(f'{self.b}는 {food}섭취')
ani=Anime('핫산','조프')
ani.health('야구')
ani.eat('프로틴')

class문 설정

class An(Anime):    #상속 설정
    pass            #속성 동일하게
qw=An('지토','베기')
qw.health('축구')
qw.eat('고기')

상속문은 부모class의 속성과 같이한다.

2. 클래스 상속 시 생성자 호출 순서

자식 클래스에서 생성자를 호출하면, 부모 클래스의 생성자가 호출된다. 자식 생성자안에서 부모 생성자를 호출해야한다면 super() 함수를 이용해야 합니다. 부모 클래스에 있는 생성자의 실행작업이 끝나면, 자식 클래스의 생성자로 돌아가 코드가 실행됩니다.

#클래스간 생성자 호출 순서
class Parent:               #부모클래스 생성
    def __init__(self):
        print('Parent클래스 호출')

class Child(Parent):
    def __init__(self):
        print('Child클래스 호출')
        super().__init__()  #자식클래스->부모클래스 생성자 호출
        print('Child클래스2 호출')

t=Child()

 

3. object 클래스

object는 파이썬의 모든 클래스의 기본 클래스입니다. object 클래스는 파이썬에서 모든 객체의 기본적인 동작과 특성을 정의합니다. object는 원 클래스의 기본값이라고 생각하면 됩니다.

  • object 클래스는 모든 클래스에서 상속을 받음
  • object가 상속해주는 메서드
class MyClass:			#원래형태
    pass

class MyClass(object):	#클래스의 기본값
    pass

4. 메서드 오버라이딩

메서드 오버라이딩(Method Overriding)은 객체 지향 프로그래밍에서 중요한 개념 중 하나로, 서브 클래스(자식 클래스)에서 슈퍼 클래스(부모 클래스)에 있는 메서드를 동일한 이름으로 다시 만드는 것을 의미합니다. 오버라이딩을 사용하면, 서브 클래스에서 상속받은 메서드의 동작을 변경하거나 확장할 수 있습니다.

  • 부모 클래스 메서드->자식 클래스 메서드를 사용하여, 다시 재정의함
  • 서브 클래스에서 슈퍼 클래스의 메서드 재정의
  • 부모클래스에서 자식클래스를 알 수 없기 때문에 자식 클래스의 객체 메소드를 사용하지 못합니다.
#메서드 오버라이딩
class Anime:
    def __init__(self,a,b): #생성자
        self.a=a
        self.b=b
    def health(self,sports):    #1변수 출력
        print(f'{self.a}는 {sports}이용')

    def eat(self,food):     #2변수 출력
        print(f'{self.b}는 {food}섭취')

class An(Anime):    #자식 클래스
    def run(self):  #자식 클래스 생성자
        print(f'{self.a}는 달리기')    

    def eat(self,food):     #
        print(f'{self.b}는 {food}를 2번 섭취') 
ani=An('핫산','조프')   #자식클래스 호출
ani.health('야구')
ani.run()   #자식클래스 영향받음
ani.eat('지방')

5. 다중 상속

다중상속클래스가 둘 이상의 부모 클래스로부터 상속을 받는 기능을 의미합니다. 파이썬은 다른 많은 객체 지향 언어와 달리 다중 상속을 지원합니다. 다중 상속을 사용하면 코드의 재사용성을 향상시킬 수 있지만, 동시에 복잡성이 높아지기 때문에 주의해야 합니다.

  • 1클래스, 2클래스->자식클래스(1클래스,2클래스) 다중상속 형태
#사용형태
class parent1:
    pass

class Parent2:
    pass

class Child(Parent1,Parent1):
    pass
class Anime:    #1 Class
    def __init__(self,a,b): #생성자
        self.a=a
        self.b=b
    def health(self,sports):    #1변수 출력
        print(f'{self.a}는 {sports}이용')

class Gal:      #2 Class
    def __init__(self,a,b): #생성자
        self.a=a
        self.b=b

    def sleep(self,hour):
        print(f'{self.b}는 {hour}시간 숙면')

class Kuma(Anime,Gal):  #Anime클래스, Gal클래스로부터 다중상속
    pass

ku=Kuma('쿰','밥')
ku.health('배구')
ku.sleep(18)

C3선형화 알고리즘

  • Python의 다중 상속에서 메서드 해결 순서(Method Resolution Order, MRO)를 계산하는데 사용되는 알고리즘
  • 복잡한 상속 구조에서 메서드 호출 순서를 명확하게 결정하기 위해 고안된 알고리즘

MRO그림

6. super() 메서드

super()는 파이썬의 내장 함수로서, 상속과 관련된 작업을 수행할 때 사용됩니다. 특히, 자식 클래스에서 부모 클래스의 메서드를 호출할 때 사용됩니다. super()의 주요 목적은 자식 클래스에서 부모 클래스의 메서드를 오버라이드(재정의)하면서도 그 오버라이드된 메서드 내에서 부모 클래스의 원본 메서드를 호출하는 것입니다.

6-1. 기본적인 사용형태

  • super(): 자식클래스->부모클래스 함수(메서드)이동
#super()메서드 1개
class Parent:
    def hi(self):
        print('부모클래스 hi출력')

class Child(Parent):
    def hi(self):
        super().hi()
        print('자식클래스 hi출력')

ch=Child()
ch.hi()

6-2. __init__메서드 사용

__init_메서드를 이용해 생성자 함수를 생성해서, 자식클래스->부모클래스를 호출합니다.

# __init__ 이용
class Parent:
    def __init__(self,value):
        self.value=value

class Child(Parent):
    def __init__(self, value, child_value):
        super().__init__(value) # super()로 부모클래스 호출
        self.child_value = child_value

ch=Child(10,20)
print(ch.child_value)

6-3. 다중 상속

다중 상속은 부모클래스->중간 클래스->자식 클래스 가 복합적으로 겹쳐있는 구조입니다. 출력순서는 mro()메서드의 출력결과의 순서에 따라 결정됩니다.

class Base: #기본 object클래스
    def hello(self):
        print('Base의 hello')
        print('Base 클래스의 hello 메서드')

class A(Base):  #자식클래스1
    def hello(self):
        print('A의 hello')
        super().hello()
        print('A클래스의 hello 메서드')

class B(Base):  #자식클래스2
    def hello(self):
        print('B의 hello')
        super().hello()
        print('B클래스의 hello 메서드')

class Child(A,B):   #다중상속받 클래스
    def hello(self):    #맨처음 호출된 함수->그러나 print없이 super()걸림->부모 클래스로 돌아감
        print('Child의 hello')
        super().hello()
        print('Child 클래스의 hello 메서드 호출')

mro순서: Child->A->B->object

child=Child() #mro순으로 갔다가 역순으로 돌아가기
child.hello()

위 코드의 출력순서는 MRO순서로 갔다가 MRO의 역순으로 되돌아옵니다.