python

[python] class 상속 (inheritance)

전감자(◔◡◔) 2022. 9. 26. 21:19

클래스 상속

 

'''
   상속 ( inheritance )
'''

# 애완동물 관리 어플리케이션 개발중입니다. ( 강아지와 고양이, 새, 거북이, ....... ...)
'''
   고양이   ======================> Cat
   속성: 이름, 나이 ,성별 =========> 인스턴스 변수 ( 생성자 이용해서 초기화 )
   동작: 먹기, 자기, 뛰기 =========> 메서드 
   강아지 =========================> Dog
   속성: 이름, 나이, 색상 =========> 인스턴스 변수  ( 생성자 이용해서 초기화 )
   동작: 먹기, 자기, 수영 ========> 메서드
'''
class Cat:
    def __init__(self,username, age, gender):
        self.username = username
        self.age = age
        self.gender = gender
    def cat_eat(self):
        print("고양이 먹기")
    def cat_sleep(self):
        print("고양이 자기")
    def cat_뛰기(self):
        print("고양이 뛰기")
    # getter와 setter 메서드 생략

class Dog:
    def __init__(self,username, age, color):
        self.username = username
        self.age = age
        self.color = color
    def dog_eat(self):
        print("강아지 먹기")
    def dog_sleep(self):
        print("강아지 자기")
    def dog_swim(self):
        print("강아지 수영하기")
    # getter와 setter 메서드 생략


c1 = Cat("야옹이",2,"암컷")
d1 = Dog("망치",1, "흰색")

print("고양이정보: 이름:{} 나이:{}, 성별:{}".format(c1.username, c1.age, c1.gender))
print("강아지정보: 이름:{} 나이:{}, 성별:{}".format(d1.username, d1.age, d1.color))

클래스 상속 전 

 

'''
   상속 ( inheritance )
'''

# 애완동물 관리 어플리케이션 개발중입니다. ( 강아지와 고양이, 새, 거북이, ....... ...)
'''
   고양이   ======================> Cat
   속성: 이름, 나이 ,성별 =========> 인스턴스 변수 ( 생성자 이용해서 초기화 )
   동작: 먹기, 자기, 뛰기 =========> 메서드 
   강아지 =========================> Dog
   속성: 이름, 나이, 색상 =========> 인스턴스 변수  ( 생성자 이용해서 초기화 )
   동작: 먹기, 자기, 수영 ========> 메서드
'''


class Cat:
    def __init__(self, username, age, gender):
        self.username = username
        self.age = age
        self.gender = gender

    def cat_eat(self):
        print("고양이 먹기")

    def cat_sleep(self):
        print("고양이 자기")

    def cat_run(self):
        print("고양이 뛰기")
    # getter와 setter 메서드 생략


class Dog:
    def __init__(self, username, age, color):
        self.username = username
        self.age = age
        self.color = color

    def dog_eat(self):
        print("강아지 먹기")

    def dog_sleep(self):
        print("강아지 자기")

    def dog_swim(self):
        print("강아지 수영하기")
    # getter와 setter 메서드 생략


c1 = Cat("야옹이", 2, "암컷")
d1 = Dog("망치", 1, "흰색")

print("고양이정보: 이름:{} 나이:{}, 성별:{}".format(c1.username, c1.age, c1.gender))
print("강아지정보: 이름:{} 나이:{}, 성별:{}".format(d1.username, d1.age, d1.color))

# 고양이 액션
c1.cat_eat()
c1.cat_sleep()
c1.cat_run()

# 강아지 액션
d1.dog_eat()
d1.dog_sleep()
d1.dog_swim()

'''
 상속전 코드 문제점
 1. 코드 중복 ====> 해결: 중복 제거
   - 동일한 속성들이 각 클래스 중복됨.

 2. 메서드명이 너무 많다. ========> 해결: 동일한 이름으로 
   - 프로그램 관리가 어려워진다.
'''

 

클래스 상속 후 1

'''
   상속 ( inheritance) 방법
  1. 공통적인 속성 및 동작을 추출해서 새로운 클래스(Pet)로 작성한다.
    이 클래스는 기존의 존재하는 클래스(강아지, 고양이)를 개념적으로 포함하는 클래스(애완동물 Pet)로 작성한다.
     Pet
 Cat     Dog
  2. 상속 적용
     class Cat(Pet):
'''
# 1. 공통적인 속성 및 동작을 추출해서 새로운 클래스(Pet) 생성
class Pet:
    # 공통적인 속성 추출
    def __init__(self,username, age):
        self.username = username
        self.age = age

class Cat(Pet):
   def __init__(self, username, age, gender):
       super().__init__(username, age)
       self.gender = gender

   def cat_print(self):
       print(self.username, self.age)
c1 = Cat("야옹이", 2, "암컷") # 이름, 나이, 성별
class Dog(Pet):
    def __init__(self, username, age, color):
        super().__init__(username, age)
        self.color = color

    def dog_print(self):
        print(self.username, self.age)

# p1 = Pet("망치", 2)
c1 = Cat("야옹이", 2, "암컷") # 이름, 나이, 성별
d1 = Dog("망치", 1, "흰색")  # 이름, 나이 , 색상
c1.cat_print()
d1.dog_print()

클래스 상속 후 2 부모호출1

 

class Pet:
    def __init__(self):
        print("Pet 생성자")
        self.age = 10


class Cat(Pet):
    def __init__(self):
        super().__init__()
        print("Cat 생성자")
        print(self.age)

# 자식인 Cat 생성 ===> 내부적으로는 Pet을 먼저 생성해야 된다.
c1 = Cat()

클래스 상속 후 2 부모호출2




class Pet:
    def __init__(self, username, age): # 공통적인 속성을 추출해서 부모인 Pet에서 선언
        self.username = username
        self.age = age

class Cat(Pet):

    def __init__(self, username, age, gender): # 이름, 나이, 성별 3가지 속성을 가진 Cat
        # self.username = username
        # self.age = age
        super().__init__(username,age) # 부모생성자를 호출하면서 부모를 먼저 생성함.
                                       # 동시에 부모에서 선언된 username과 age 값을 초기화하기 위해서
                                       # 로컬값을 전달함
        self.gender = gender
    # def cat_print(self):
    #     print(self.username, self.age, self.gender)

    def __str__(self):
        return ">>>" + self.username + str(self.age)+ self.gender

c1 = Cat("야옹이", 2, "암컷")
# c1.cat_print()
print(c1) # ==> __str__ 자동호출

# 계층구조
print(Cat.mro())