# 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 값이 뜨면서 뜬다. 그래서 아래에 그대로 출력하는거 하면 그대로 출력이 나온다. 이 구조 전체를 파악하고 문제점을 찾는 법을 알아야한다.