메소드 오버라이딩 효과

  1. 서브클래스(자식)에서 슈퍼(부모)클래스를 호출 후 사용
  2. 메소드 재 정의 후 사용가능
  3. 부모클래스의 메소드를 추상화 후 사용가능(구조적 접근)
  4. 확장 가능, 다형성(다양한 방식으로 동작)
  5. 가독성 증가, 오류가능성 감소, 메소드 이름 절약, 유지보수성 증가
# Ex1
# 기본 Overriding 예제

class ParentEx1():
    def __init__(self):
        self.value = 5

    def get_value(self):
        return self.value

class ChildEx1(ParentEx1):
    pass

c1 = ChildEx1()
p1 = ParentEx1()

print('Ex1 > ', c1.get_value())

# c1 모든 속성 출력
print('Ex1 > ', dir(c1))

print('Ex1 > ', dir(ParentEx1))
print('Ex1 > ', dir(ChildEx1))

print('Ex1 > ', ParentEx1.__dict__)
print('Ex1 > ', ChildEx1.__dict__)

dir은 부모 내용도 다 가져와서 보여주지만 dict는 자기가 가지고 있는거만 가지고 있다가, 인스턴스화 될때 부모에게 재정으 해서 물려받는다. 이 점을 기억해야한다.

# Ex2
# 기본 Overriding 메소드 재정의

class ParentEx2():
    def __init__(self):
        self.value = 5

    def get_value(self):
        return self.value

class ChildEx2(ParentEx2):
    def get_value(self):
        return self.value * 10

c2 = ChildEx2()

print('Ex2 > ', c2.get_value())
# Ex3
# Overriding 다형성 예제

import datetime

class Logger():
    def log(self, msg):
        print(msg)

class TimestampLogger(Logger):
    def log(self, msg):
        message = '{ts} {msg}'.format(ts=datetime.datetime.now(), msg=msg)
        # super().log(message) 아래와 똑같이 된다.
        super(TimestampLogger, self).log(message)

class DateLogger(Logger):
    def log(self, msg):
        message = '{ts} {msg}'.format(ts=datetime.datetime.now().strftime('%Y-%m-%d'), msg=msg)
        super(DateLogger, self).log(message)

l = Logger()
t = TimestampLogger()
d = DateLogger()

# 메소드 실행
print(l.log('Called logger.'))
print(t.log('Called Timestamp logger.'))
print(d.log('Called date logger.'))

l.log('test1')
t.log('test2')
d.log('test3')

이거 print문에 print쒸어서 None 값이 뜨면서 뜬다. 그래서 아래에 그대로 출력하는거 하면 그대로 출력이 나온다. 이 구조 전체를 파악하고 문제점을 찾는 법을 알아야한다.