강의목표

1. 다중상속에 대한 개념을 이해하고 선언할 수 있다.
2. 다형성의 개념을 이해하고 설계할 수 있다.

 

============================================================================

다중상속 : 하나 이상의 선조를 가질 수 있는 후손의 구조
두 개 이상의 선조가 같은 메소드를 가지고 있을 때 먼저 정의된 쪽이 호출된다.

class Dog:
    def sound(self):
        print("bark")


class Cat:
    def sound(self):
        print("meow")
        
        
class Chimera(Cat, Dog):  # 다중상속, SubClassing
    pass
    
    
if __name__ == '__main__':
    Chimera().sound()
    
    
#result
meow

# class Chimera(Dog, Cat): 을 하면 결과로 bark이 나온다

 

============================================================================

다형성
어떤 한 요소에 여러 개념을 넣어놓은 것으로 일반적인 클래스 상속 구조에서
재정의(상속시에 같은 이름의 메소드가 여러 클래스에서 다른 기능을 하는 것)하는 것을 의미

특징
    AA <- BB, AA <- CC
  - 여러 개의 클래스가 같은 이름의 메소드에 대하여 각자 다른 방법으로 작동할 수 있도록 설계

  - 하나의 데이터 유형(선조 객체) 변수로 여러 유형의 객체 참조(후손)가 가능하다

  - 변수가 참조하는 객체의 유형에 맞는 메소드를 자동으로 호출할 수 있다.

  - 추상화를 이용하여 다양한 구현을 제공할 수 있다.

강사님이 만드셨다니까 올려도 괜찮지 않을까...


필요조건
1. 상속관계의 클래스이면서 후손 클래스 객체에서 작동된다.
2. 후손 클래스 객체의 메소드 호출은 선조 클래스 유형의 변수를 통해 호출되며 
   재정의 된 메소드여야 한다.

from abc import abstractmethod, ABCMeta  # 추상화를 위해 모듈을 import
class Base(metaclass=ABCMeta):
    @abstractmethod                      # 메소드를 추상메소드로 지정하는 데코레이션
    def start(self):
        print("파이썬만 추상메소드에 기능을 줄 수 있다")
        print("Base start")

    @abstractmethod                      # 메소드를 추상메소드로 지정하는 데코레이션
    def Stop(self):
        print("Base Stop")

# 선조클래스에 추상메소드가 있기때문에 자손클래스들은 Subtyping을 해줘야한다
class Cat(Base):
    def start(self):
        print("Cat start")

    def Stop(self):
        print("Cat Stop")


class Duck(Base):
    def start(self):
        print("Duck start")

    def Stop(self):
        print("Duck Stop")


class Puppy(Base):
    def start(self):
        print("Puppy start")

    def Stop(self):
        print("Puppy Stop")


def MY_Call(m):
    m.start()
    m.Stop()


if __name__ == '__main__':
    MY_Call(Puppy())
    MY_Call(Cat())
    MY_Call(Duck())
    
    
#result 똑같은 함수명으로 호출했지만 생성된 객체에 따라 결과값이 전부 다양하게 형성됨
Puppy start
Puppy Stop
Cat start
Cat Stop
Duck start
Duck Stop

 

============================================================================

추상화(abstract)
  - Subclassing : 상속의 유형 중에서 선조 클래스의 속성과 구조를 그대로 가지면서
                      새로운 데이터 멤버 변수와 멤버 메소드를 추가해서 재사용하는 방법
  - Subtyping : 선조 클래스가 수행할 명령을 선언하고 후손 클래스가 상속을 받아서
                    선조 클래스의 객체를 후손 클래스의 타입으로 대처해서 실행할 수 있게 해주는 방법

# 파이썬의 서브타이핑은 추상클래스를 지원하면서 duck typing을 지원한다.
# duck typing은 동적바인딩의 한 종류로 duck클래스 객체를 선언하면 duck이 생성되어 
   호출된다는 말로 객체의 변수 및 메소드의 집합이 객체의 타입을 결정하는 것을 말한다.

서브타이핑시에 선조의 주소로 후손의 객체를 가지는 것이 아니라 추상클래스를 선언하고
재정의를 하면서 후손의 객체 주소를 각각 생성해서 메소드를 실행하게 된다.

1. 추상메소드 : 후손을 위해 선조가 강제로 재정의할 수 있게 선언된 메소드
2. 추상메소드를 포함한 클래스는 추상클래스가 된다.
3. 추상클래스는 객체 생성이 불가능하다.
4. 추상클래스를 상속받는 후손클래스가 선조의 추상메소드를 재정의하지 않으면 
   본인이 추상클래스가 된다.

 

파이썬에서 선언하는 추상클래스는? ABCMeta: Abstract Base Class Meta Class

from abc import abstractmethod, ABCMeta
@abstractmethod : 메소드를 추상메소드로 지정
@property : 메소드를 변수로 호출할 수 있도록 지정
@staticmethod : 정적메소드로 지정
@classmethod : 클래스 인스턴스 메소드로 지정

# @property : 메소드를 변수로 호출할 수 있도록 지정
class My:
    def __init__(self):
        self.x = 0

    @property  # @mFun.getter
    def mFun(self):     # 멤버 변수 x를 리턴하는 method
        return self.x

    @mFun.setter
    def mFun(self, x):  # 멤버 변수 x에게 지역변수 x가 값을 받아 전달 및 변경하는 method
        self.x = x


if __name__ == '__main__':
    a = My()
    a.mFun = 100         # mFun(100)으로 값을 전달 해야하지만 변수처럼 전달 가능
    print(a.mFun)         # mFun()으로 값을 전달 받아야하지만 변수처럼 받기 가능
    
    
#result
100

+ Recent posts