210429 python day-10 : 다중상속, 다형성
강의목표
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