본문 바로가기
python

python - Override (재정의)

by orangecode 2022. 4. 29.
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())

 

반응형

댓글