728x90
다형성
다형성이란 하나의 변수명이나 함수명이 상황별로 다른 의미로 해석될 수 있다는 점이다.
다형성은 Overriding, Overloading이 가능하다는 말이다.
Overriding
부모클래스의 method와 같은 이름, 매개변수를 재정의 하는 것.
Overloading
같은 이름의 함수를 여러개 정의하고,
매개 변수의 타입, 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것.
Override(재정의)
class의 C1, C2가 다를 때
class C1을 C2가 Override 할 때
### Override
# 재정의
class C1: # class
def m(self): # method
return 'parent'
class C2(C1): # Class C1을 상속받음
def m(self):
return 'children'
pass # pass = method가 존재하지 않는 클래스 pass
k = C2()
print(k.m())
Override에서 부모 클래스 method 사용하기
자식 class인 C2에서 super() method를 사용하면
부모 class의 method인 m을 가져올 수 있다.
class C2(C1): # Class C1을 상속받음
def m(self):
# super().m # 부모 class의 method를 사용한다.
return super().m() + ' children'
pass # pass = method가 존재하지 않는 클래스 pass
return 값에 super().m()을 입력하면,
return 값으로 부모 클래스의 parent와 자식 클래스의 children을 가져온다.
Override의 활용
# 계산기 Cal
class Cal(object):
_history = [] # _history 정의
def __init__(self, v1, v2): # v1, v2 : __init__내부에서만 사용가능한 지역변수
if isinstance(v1, int):
self.v1 = v1
if isinstance(v2, int):
self.v2 = v2
def add(self):
result = self.v1 + self.v2 # result 변수 정의
Cal._history.append("add : %d+%d=%d" % (self.v1, self.v2, result) ) # Cal class의 _history 변수에 추가함
return result
def subtract(self):
result = self.v1 - self.v2
Cal._history.append("subtract : %d+%d=%d" % (self.v1, self.v2, result))
return result
def setV1(self, v):
if isinstance(v, int):
self.v1 = v
def getV1(self):
return self.v1
@classmethod # classmethod
def history(cls): # 첫번째 인자는 cls로 정의
for item in Cal._history: # _ = 내부에서만 사용할 변수
print(item)
def info(self): # Cal의 info method 설정 = Cal의 v1 : self.v1, v2 : self.v2
return "Cal => v1 : %d, v2 : %d" % (self.v1, self.v2)
## CalMultiply
class CalMultiply(Cal): # Cal이 가진 모든 method를 상속받음
def multiply(self):
return self.v1*self.v2
def info(self):
return "CalMultiply => %s" % super().info() # info method가 Cal의 classmethod info()를 가져옴 # %s % = str 값을 나타냄
class CalDivide(CalMultiply): # CalMultiply가 가진 모든 method를 상속받음
def divide(self):
return self.v1 / self.v2
def info(self): # info method가 # info method가 CalMultiply의 classmethod info()
return "CalDivide => %s " % super().info()
c0 = Cal(30, 60)
print(c0.info())
c1 = CalMultiply(30,10) # c1은 Cal과 CalMultiply의 method를 모두 사용가능하다.
print(c1.info())
c2 = CalDivide(20, 10) # c2은 Cal, CalMultiply, CalDivide의 method를 모두 사용가능하다.
print(c2.info())
반응형
'python' 카테고리의 다른 글
python - 추상클래스(abstract class) (0) | 2022.05.02 |
---|---|
python - 객체 지향 프로그래밍(클래스, 생성자, 인스턴트 변수, 메소드) (0) | 2022.05.02 |
python - Class member, Class method (0) | 2022.04.29 |
python - 상속(inheritance) (0) | 2022.04.28 |
pyhthon - 인캡슐레이션Encapsulation(캡슐화) (0) | 2022.04.28 |
댓글