본문 바로가기
Programming/Python

08. 클래스 상속 (Class inheritance)

by goatlab 2021. 12. 8.
728x90
반응형
SMALL

클래스 상속 (Class inheritance)

 

class에서 상속이란, 물려주는 class (parent Class, super class)의 내용 (속성과 method)을 물려받는 class (child class, sub class)가 가지게 되는 것입니다. 기존의 클래스에서 확장하여 새로운 클래스 정의

 

super() : 선조의 변수나 메소드를 가리킬

 

오버라이딩 : 메소드 재정의, 메소드의 기능을 변경, 선조클래스에 존재해야함, 메소드명 같아야함, 파라미터 개수 같아야함, 리턴형이 같지 않아도

 

다형성 : 오버라이딩, 오버로딩, 프로그램 안의 관계

  1. 서브 클래싱 : 선조 속성 구조 그대로, 코드 재사용
  2. 서브타이핑 : 상속과 선조 클래스가 수행할 명령을 선언, 클래스 타입으로 대체

 

추상 클래스 : 인스턴스 생성 불가능, 추상 메소드 구현( ABC, abstractmethod() )

  1. 데코레이션 설정 : 코드 간결화
  2. 장식자 : 메소드 앞에 적용되어 기존함수를 다른 함수로 전환, 타입검사나 디버깅 사용

 

class Parentclass:
    ......

class Childclass(Parentclass): # 상속시 parent class 포함해서 선언
    ......

 

상속

 

class Person: # super class
    name = '이름'
    age = '나이'
    job = '직업'

    def show(self):
        print('Person 클래스의 메소드')

class Kim(Person): # sub class
    def __init__(self, name):
        self.name = name

    def show_name(self):
        print('사람 이름은 : ', self.name)
        
a = Kim('김')
a.show()
a.show_name()
a.age        
        
--> Person 클래스의 메소드
--> 사람 이름은 :  김
--> '나이'

 

 

다중 상속

 

하나 이상의 선조, 먼저 정의된 쪽을 호출

 

class Parentclass1:
        ......

    class Parentclass2:
        ......

    class Childclass(Parentclass1, Parentclass2):
        ......

 

◦ mro() method

 

class를 작성하면 상속 관계를 확인할 수 있는 method

 

Kim.mro()

 

정적메소드

 

정적메소드는 class에서 직접 접근할 수 있는 method이다. class에서 직접 접근할 수 있는 method가 두가지가 있다. staticmethod와 classmethod이다. python에서 정적메소드임에도 인스턴스에서도 접근이 가능하다.

 

class Custom:

    # instance method
    def add_instance_method(self, a,b):
        return a + b

    # classmethod
    @classmethod
    def add_class_method(cls, a, b):
        return a + b

    # staticmethod
    @staticmethod
    def add_static_method(a, b):
        return a + b
        
Custom.add_instance_method(None, 3, 5)
--> 8

Custom.add_class_method(3, 5)
--> 8

Custom.add_static_method(3, 5)
--> 8 

a = Custom()
a.add_class_method(3, 5)
--> 8
a.add_static_method(3, 5)
--> 8
class Nation:
    default_nation = "England"

    def __init__(self):
        self.show = '나의 나라는' + self.default_nation

    @classmethod
    def class_my_nation(cls):
        return cls()

    @staticmethod
    def static_my_nation():
        return Nation()

    def print_nation(self):
        print(self.show)

class Korea(Nation):
    default_nation = "한국"
    
a = Korea.static_my_nation()
b = Korea.class_my_nation()
a.print_nation()
--> 나의 나라는England

b.print_nation()
--> 나의 나라는한국

 

추상클래스 (abstarct class)

 

미구현 추상메소드를 한개 이상 가지며, 자식클래스에서 해당 추상 메소드를 반드시 구현하도록 한다. 인스턴스 생성 불가능, 추상 메소드 구현( ABC, abstractmethod() )

 

from abc import *

class 추상클래스명(metaclass=ABCMeta):

     @abstractmethod
        def 추상메소드(self):
            pass
from abc import *

class AbstractPerson(metaclass=ABCMeta):
    name = '이름'
    age = '나이'
    job = '직업'

    def show(self):
        print('사람 클래스의 메소드')
        
    @abstractmethod
    def show_age(self):
        print('사람의 나이는?')    

class Kim(AbstractPerson):

    def __init__(self, name, age, job):
        self.name = name
        self.age = age
        self.job = job

    def show_name(self):
        print('사람 이름은 : ', self.name)
        
    def show_age(self):
        super().show_age()
        print(self.age)    
               
a = Kim("김", 30, '백수')
a.show_name()
--> 사람 이름은 :  김

a.show_age()
--> 사람의 나이는?
--> 30

 

덕 타이핑 (Duck Typing)

 

속성과 method 존재에 의해 객체의 적합성이 결정된다. ‘오리처럼 걷고 오리처럼 말한다면 오리일 것이다’라는 원리를 따른다. 이는 객체의 클래스가 무엇인지는 상관하지 않고 해당 객체에 필요한 동작이 구현되어 있다면 작동한다는 것을 의미한다. 객체의 유형은 런타임에 구분된다.

728x90
반응형
LIST

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

10. 예외처리  (0) 2021.12.15
09. 모듈 (Module)  (0) 2021.12.08
07. 클래스 (Class)  (0) 2021.12.08
06. 함수 (Function)  (0) 2021.12.08
05. 제어문 (If, For, While)  (0) 2021.12.08