210430 python - 클래스, 상속, 모듈화 활용
엄밀히 말하면 과제는 아닌데 수업 중 했던 클래스만들기 복습차 해봄
목표
두 수를 입력을 받아서 사칙연산을 구현하는 클래스 만들기
============================================================================
[step 1 : 생성자로 멤버변수에 값을 저장하고 변수를 이용해 사칙연산을 계산하는 함수를 코드로 작성]
class Calc:
def __init__(self, x, y):
self.x = x
self.y = y
def add(self):
return self.x + self.y
def sub(self):
return self.x - self.y
def mul(self):
return self.x * self.y
def div(self):
return self.x / self.
if __name__ == '__main__':
m = Calc(200, 100)
print(m.add())
print(m.sub())
print(m.mul())
print(m.div())
#result
300
100
20000
2.0
============================================================================
[step 2 : 멤버변수 은닉을 위해 private으로 바꾸고 getter&setter 함수 작성(캡슐화)]
class Calc:
def __init__(self, x, y):
self.__x = x
self.__y = y
#============추가============
def get_x(self):
return self.__x
def get_y(self):
return self.__y
def set_x(self, x):
self.__x = x
def set_y(self, y):
self.__y = y
#============추가============
def add(self):
return self.__x + self.__y
def sub(self):
return self.__x - self.__y
def mul(self):
return self.__x * self.__y
def div(self):
return self.__x / self.__y
if __name__ == '__main__':
m = Calc(200, 100)
print("{0} + {1} = {2}".format(m.get_x(), m.get_y(), m.add()))
print("{0} - {1} = {2}".format(m.get_x(), m.get_y(), m.sub()))
print("{0} * {1} = {2}".format(m.get_x(), m.get_y(), m.mul()))
print("{0} / {1} = {2}".format(m.get_x(), m.get_y(), m.div()))
print()
m.set_x(400)
m.set_y(200)
print("{0} + {1} = {2}".format(m.get_x(), m.get_y(), m.add()))
print("{0} - {1} = {2}".format(m.get_x(), m.get_y(), m.sub()))
print("{0} * {1} = {2}".format(m.get_x(), m.get_y(), m.mul()))
print("{0} / {1} = {2}".format(m.get_x(), m.get_y(), m.div()))
#result
200 + 100 = 300
200 - 100 = 100
200 * 100 = 20000
200 / 100 = 2.0
400 + 200 = 600
400 - 200 = 200
400 * 200 = 80000
400 / 200 = 2.0
============================================================================
[step 3 : 출력문 작성]
class Calc:
def __init__(self, x, y):
self.__x = x
self.__y = y
def get_x(self):
return self.__x
def get_y(self):
return self.__y
def set_x(self, x):
self.__x = x
def set_y(self, y):
self.__y = y
def add(self):
return self.__x + self.__y
def sub(self):
return self.__x - self.__y
def mul(self):
return self.__x * self.__y
def div(self):
return self.__x / self.__y
#============추가============
def prn(self):
print("{0} + {1} = {2}".format(self.__x, self.__y, self.add()))
print("{0} - {1} = {2}".format(self.__x, self.__y, self.sub()))
print("{0} * {1} = {2}".format(self.__x, self.__y, self.mul()))
print("{0} / {1} = {2}".format(self.__x, self.__y, self.div()))
print()
#============추가============
if __name__ == '__main__':
m = Calc(200, 100)
m.prn()
m.set_x(400)
m.set_y(200)
m.prn()
#result
200 + 100 = 300
200 - 100 = 100
200 * 100 = 20000
200 / 100 = 2.0
400 + 200 = 600
400 - 200 = 200
400 * 200 = 80000
400 / 200 = 2.0
============================================================================
[steep 4 : 모듈화 후 import해서 사용]
Calc.py
class Calc:
def __init__(self, x, y):
self.__x = x
self.__y = y
def get_x(self):
return self.__x
def get_y(self):
return self.__y
def set_x(self, x):
self.__x = x
def set_y(self, y):
self.__y = y
def add(self):
return self.__x + self.__y
def sub(self):
return self.__x - self.__y
def mul(self):
return self.__x * self.__y
def div(self):
return self.__x / self.__y
def prn(self):
print("{0} + {1} = {2}".format(self.__x, self.__y, self.add()))
print("{0} - {1} = {2}".format(self.__x, self.__y, self.sub()))
print("{0} * {1} = {2}".format(self.__x, self.__y, self.mul()))
print("{0} / {1} = {2}".format(self.__x, self.__y, self.div()))
print()
init.py
from com.test.Calc import Calc
# 패키지안의 파일명, 파일안의 클래스명
if __name__ == '__main__':
m = Calc(200, 100)
m.prn()
m.set_x(400)
m.set_y(200)
m.prn()
#result
200 + 100 = 300
200 - 100 = 100
200 * 100 = 20000
200 / 100 = 2.0
400 + 200 = 600
400 - 200 = 200
400 * 200 = 80000
400 / 200 = 2.0
============================================================================
[step 5 : 상속, 추상화, subtyping 해보기]
Calc.py
#============추가============
from abc import abstractmethod, ABCMeta
#============추가============
# metaclass=ABCMeta 추가
class Calc(metaclass=ABCMeta):
def __init__(self, x, y):
self.__x = x
self.__y = y
def get_x(self):
return self.__x
def get_y(self):
return self.__y
def set_x(self, x):
self.__x = x
def set_y(self, y):
self.__y = y
def add(self):
return self.__x + self.__y
def sub(self):
return self.__x - self.__y
def mul(self):
return self.__x * self.__y
def div(self):
return self.__x / self.__y
#============추가============
@abstractmethod
def mod(self):
pass
#============추가============
def prn(self):
print("{0} + {1} = {2}".format(self.__x, self.__y, self.add()))
print("{0} - {1} = {2}".format(self.__x, self.__y, self.sub()))
print("{0} * {1} = {2}".format(self.__x, self.__y, self.mul()))
print("{0} / {1} = {2}".format(self.__x, self.__y, self.div()))
print()
init.py
from com.test.Calc import Calc
class MyCalc(Calc):
def __init__(self, a, b):
super().__init__(a, b)
def mod(self):
return self.get_x() % self.get_y()
def prn(self):
print("{0} % {1} = {2}".format(super().get_x(), super().get_y(), self.mod()))
super().prn()
if __name__ == '__main__':
m = MyCalc(200, 100)
m.prn()
m.set_x(400)
m.set_y(200)
m.prn()
#result
200 % 100 = 0
200 + 100 = 300
200 - 100 = 100
200 * 100 = 20000
200 / 100 = 2.0
400 % 200 = 0
400 + 200 = 600
400 - 200 = 200
400 * 200 = 80000
400 / 200 = 2.0
============================================================================