[python] 상속

728x90

1. 일반상속

#부모 값
class Unit:
    def __init__(self,name,hp):
        self.name = name
        self.hp = hp
        
        
#자식 값
class AttackUnit(Unit):
    def __init__(self,name,hp,damage):
        Unit.__init__(self,name,hp) # 상속
        self.damage = damage
        
    def attack(self,location):
        print("{0} : {1} 방향으로 적군을 공격합니다. [공격력]:{2}".format(self.name,location,self.damage))
        
    def damaged(self,damage):
        print("{0}: {1} 데미지를 입었습니다.".format(self.name,damage))
        self.hp -= damage
        print("{0} : 현재 체력은 {1}입니다. ".format(self.name,self.hp))
        if self.hp <=0:
            print("{0}: 파괴되었습니다.".format(self.name))   
            
robot = AttackUnit("로봇",50,16)
robot.attack("5시")             

robot.damaged(25)
robot.damaged(25)

파이썬에서 상속(Inheritance)은 객체 지향 프로그래밍의 중요한 개념 중 하나로, 기존 클래스를 기반으로 새로운 클래스를 만드는 방법을 말합니다. 상속을 통해 기존 클래스의 속성과 메서드를 새로운 클래스에서 재사용할 수 있습니다. 이러한 기능을 통해 코드의 재사용성과 유지보수성을 높일 수 있습니다.

파이썬에서 상속을 구현하려면 새로운 클래스를 정의할 때 괄호 안에 기존 클래스의 이름을 적어주면 됩니다. 이렇게 정의된 새로운 클래스는 기존 클래스의 모든 속성과 메서드를 상속받습니다.

2.다중상속

다중 상속은 부모가 둘 이상인 것을 의미합니다.

 

다중 상속을 구현하려면 새로운 클래스를 정의할 때 괄호 안에 상속받고자 하는 클래스들을 쉼표로 구분하여 나열하면 됩니다.

 

#부모 값
class Unit:
    def __init__(self,name,hp):
        self.name = name
        self.hp = hp
        
        
#자식 값 #다중상속 부모1
class AttackUnit:
    def __init__(self,name,hp,damage):
        Unit.__init__(self,name,hp) # 상속
        self.damage = damage
        
    def attack(self,location):
        print("{0} : {1} 방향으로 적군을 공격합니다. [공격력]:{2}".format(self.name,location,self.damage))
        
    def damaged(self,damage):
        print("{0}: {1} 데미지를 입었습니다.".format(self.name,damage))
        self.hp -= damage
        print("{0} : 현재 체력은 {1}입니다. ".format(self.name,self.hp))
        if self.hp <=0:
            print("{0}: 파괴되었습니다.".format(self.name))   
            
#다중상속 부모2
class Flyable:
    def __init__(self,speed):
        self.speed = speed
        
    def fly(self,name,location):
        print("{0}:{1} 방향으로 날아갑니다. [속도: {2}]".format(name,location,self.speed))    
        
#다중상속 자식값
class FlyableAttack(AttackUnit,Flyable): # 다중 상속시 ,(콤마)로 구분
    def __init__(self,name,hp,damage,speed):
        AttackUnit.__init__(self,name,hp,damage)
        Flyable.__init__(self,speed)
        
rocket = FlyableAttack("로켓",200,300,400)      
rocket.fly(rocket.name,"1시")

출력)

출처: 나도코딩

1) super()

파이썬에서 super는 다중 상속을 사용하는 클래스에서 부모 클래스의 메서드를 호출하기 위해 사용하는 내장 함수입니다. super 함수를 사용하여 부모 클래스의 메서드를 호출하면 코드의 가독성을 높이고 중복 코드를 방지할 수 있습니다.

super 함수는 현재 클래스의 부모 클래스를 찾아 해당 부모 클래스의 메서드를 호출합니다. 다중 상속을 사용하는 경우, 클래스가 여러 개의 부모 클래스로부터 상속받을 수 있으므로 super를 사용하여 메서드 호출 시에 상속 순서를 따르게 됩니다.

super 함수는 super()와 같이 사용하며, 두 가지 일반적인 사용 방법이 있습니다:

부모 클래스의 메서드 호출:
super()를 사용하여 부모 클래스의 메서드를 호출합니다. 예를 들어, super().method_name() 형식으로 사용합니다.

다중 상속에서의 순서:
super()는 MRO(Method Resolution Order)를 기반으로 부모 클래스를 찾습니다. 

 

MRO란?

더보기

MRO(Metthod Resolution Order)는 다중 상속을 사용하는 클래스들 간에 메서드를 호출할 때, 상속 순서를 결정하는 알고리즘입니다. 파이썬은 다중 상속을 지원하므로 하나의 클래스가 여러 개의 클래스로부터 상속받을 수 있습니다. 이러한 상속 관계에서는 어떤 메서드를 호출해야 할지 결정하기 위해 MRO를 사용합니다.

MRO는 클래스가 상속 계층에서 어떤 순서로 메서드를 탐색할지를 정하는 규칙이며, 클래스의 선언 순서와는 독립적으로 결정됩니다. MRO는 C3 선형화(C3 linearization) 알고리즘에 따라 계산됩니다.

MRO는 다이아몬드 상속과 같이 다중 상속이 복잡한 상황에서 발생할 수 있는 메서드 호출 순서의 모호성을 해결합니다. 파이썬은 MRO를 통해 어떤 클래스의 메서드를 먼저 호출해야 하는지 명확하게 결정하여 다중 상속 시에 발생할 수 있는 충돌을 방지합니다.

 

아래는 super 함수의 간단한 예시입니다:

class Parent:
    def method(self):
        print("Parent의 메서드 호출")

class Child(Parent):
    def method(self):
        super().method()  # 부모 클래스의 메서드 호출
        print("Child의 메서드 호출")

child = Child()
child.method()

출력)

위 예시에서 Child 클래스는 Parent 클래스를 상속받습니다. Child 클래스의 method에서 super().method()를 호출하여 Parent 클래스의 method를 먼저 호출하고, 그 후에 Child 클래스의 method가 호출됩니다.

'PYTHON Programming > Python' 카테고리의 다른 글

[python] 예외처리  (0) 2024.05.21
[python] print와 pass  (0) 2024.05.21
[python] 메서드  (0) 2024.05.20
[python] 매직 메서드  (0) 2024.05.11
[python] 클래스  (0) 2024.05.11