제로베이스 데이터 스쿨_리뷰노트_파이썬 중급 05_023~05_032 / (230405 학습 내용 리뷰), 작성일_230406

김지태·2023년 4월 6일
0
post-thumbnail

깃 주소 - DennyKim111

05 023 생성자

class Calculator:

def init(self):
print('[Calculator] init() called!')

cal = Calculator()

class Calculator:

def init(self, n1, n2):
print('[Calculator] init() called!')
self.num1 = n1
self.num2 = n2

cal = Calculator(10, 20)
print(f'cal.num1 = {cal.num1}')
print(f'cal.num2 = {cal.num2}')

둘 다 고정

class Calculator:

def init(self):
print('[Calculator] init() called!')
self.num1 = 10 #-> n1 로 하지 않고 아예 10으로 값을 고정
self.num2 = 20

cal = Calculator()
print(f'cal.num1 = {cal.num1}')
print(f'cal.num2 = {cal.num2}')

하나는 고정, 하나는 고정x

class Calculator:

def init(self, n):
print('[Calculator] init() called!')
self.num1 = n
self.num2 = 203

cal = Calculator(3.14)
print(f'cal.num1 = {cal.num1}')
print(f'cal.num2 = {cal.num2}')

상속 / super()init

class P_Class:

def init(self, pNum1, pNum2):
print('[P_Class] init() called!!')
self.pNum1 = pNum1
self.pNum2 = pNum2

class C_class(P_Class):
def init(self, cNum1, cNum2):
print('[C_Class] init() called!!')

# P_Class.__init__(self, cNum1, cNum2)
super().__init__(cNum1, cNum2)    
self.cNum1 = cNum1
self.cNum2 = cNum2

cls = C_class(10, 20)

05 024 생성자 2 / init() 와 객체 속성 super()

중간고사 클래스와 기말고사 클래스를 상속 관계로 만들고 각각의 점수를 초기화 하자 / 또한 총점 및 평균을 반환하는 기능도 만들자

class MidExam:
def init(self, s1, s2, s3):
print('[MidExam] init()')

self.mid_kor_score = s1
self.mid_eng_score = s2
self.mid_mat_score = s3

def printScores(self):
print(f'mid_kor_score: {self.mid_kor_score}')
print(f'mid_eng_score: {self.mid_eng_score}')
print(f'mid_mat_score: {self.mid_mat_score}')

class EndExam(MidExam):

def init(self, s1, s2, s3, s4, s5, s6):
print('[EndExam] init()')

super().__init__(s1, s2, s3)

self.end_kor_score = s4
self.end_eng_score = s5
self.end_mat_score = s6

def printScores(self):
super().printScores()
print(f'end_kor_score: {self.mid_kor_score}')
print(f'end_eng_score: {self.mid_eng_score}')
print(f'end_mat_score: {self.mid_mat_score}')

def getTotalScore(self):
total = self.mid_kor_score + self.mid_eng_score + self.mid_mat_score
total += self.end_kor_score + self.end_eng_score + self.end_mat_score

return total

def getAverageScore(self):
return self.getTotalScore() / 6

exam = EndExam(65, 74, 57, 66, 77, 88)
print(exam.printScores())
print(exam.getTotalScore())
print(exam.getAverageScore())

05 025 다중 상속 / 2개 이상의 클래스 상속하기

class Car01:

def drive(self):
print('drive() method called!')

class Car02:
def turbo(self):
print('turbo() method called!!')

class Car03:
def fly(self):
print('fly() method called')

class Car(Car01, Car02, Car03):
def init(self):
pass

myCar = Car()
myCar.drive()
myCar.turbo()
myCar.fly()

BasicCalculator와 DeveloperCalculator 클래스를 다음과 같이 만들고 이들 클래스를 상속해서 Calculator 클래스를 만들고 사용하기

class BasicCalculator:

def add(self, n1, n2):
return n1 + n2

def sub(self, n1, n2):
return n1 - n2

def mul(self, n1, n2):
return n1 * n2

def div(self, n1, n2):
return n1 / n2

class DeveloperCalculator:
def mod(self, n1, n2):
return n1 % n2

def flo(self, n1, n2):
return n1 // n2

def exp(self, n1, n2):
return n1 ** n2

class NewCalculator(BasicCalculator, DeveloperCalculator):
def init(self):
pass

cal = NewCalculator()

print(cal.add(10, 55))
print(cal.sub(10, 55))
print(cal.mul(10, 55))
print(cal.div(10, 55))

print(cal.mod(10, 55))
print(cal.flo(10, 55))
print(cal.exp(10, 55))

삼각형 넓이 구하기 클래스를 뉴 클래스에 상속해서 'cm^2' 넣어서 넓이 구하기

class TriangleArea:
def init(self, w, h):
self.width = w
self.height = h

def printTriangleInfo(self):
print(f'self.width : {self.width}')
print(f'self.height : {self.height}')

def getArea(self):
return self.width * self.height / 2

class NewTriangleArea(TriangleArea):
def init(self, w, h):
super().init(w, h)

def getArea(self):
return str(super().getArea())+'cm^2' # -> 이 부분 중요 / super().getArea()

ta = TriangleArea(7, 8)
ta2 = NewTriangleArea(7, 8)

ta.printTriangleInfo()
ta2.printTriangleInfo()

t1 = ta.getArea()
t2 = ta2.getArea()

print(ta.getArea())
print(ta2.getArea())

print(t1)
print(t2)

05 027 추상 클래스 / 메서드 구현을 강요한다 / 상위 클래스가 하위 클래스에게 특정 메서드를 꼭 구현하라고 하는 경우(강제)

from abc import ABCMeta
from abc import abstractmethod

class Airplane(metaclass = ABCMeta):

@abstractmethod
def flight(self):
pass
def forward(self):
print('전진!!')
def backward(self):
print('후진!!')

class Airliner(Airplane):
def init(self, c):
self.color = c

def flight(self):
print('FLY!!! 시속 400 km/h 비행 ')

class Jetplane(Airplane):

def init(self, c):
self.color = c

def flight(self):
print('FLY!!! 시속 700 km/h 비행 ')

al = Airliner('red')
al.flight()
al.backward()
al.forward()

fl = Jetplane('grey')
fl.backward()
fl.forward()
fl.flight()

실습 - 계산기 추상 클래스를 만들고 이를 이용해서 새로운 계산기 클래스를 만든다. 추상 클래스에는 덧셈, 뺄셈, 곱셈, 나눗셈 기능이 선언되어야 함.

from abc import ABCMeta
from abc import abstractmethod

class Calculator(metaclass = ABCMeta):

@abstractmethod
def add(self, n1, n2):
pass

@abstractmethod
def sub(self, n1, n2):
pass

@abstractmethod
def mul(self, n1, n2):
pass

@abstractmethod
def div(self, n1, n2):
pass

class DeveloperCalculator(Calculator):
def add(self, n1, n2):
print(n1 + n2)

def sub(self, n1, n2):
print(n1 - n2)

def mul(self, n1, n2):
print(n1 * n2)

def div(self, n1, n2):
print(n1 / n2)

def mod(self, n1, n2):
print(n1%n2)

def flo(self, n1, n2):
print(n1 // n2)

dc = DeveloperCalculator().add(3, 40)

print(dc) # -> 리턴 값이 없어서 none이 나옴

05 029 예외처리 / 발생된 예외를 별도 처리함으로싸 프로그램 전체 실행에 영향 없도록

n1 = 10

n2 = 0

try:

print(n1 / n2)
print(n1 - n2)
print(n1 + n2)
print(n1 * n2)

except:
print('예상치 못하 문제 발생!')
print('다음 프로그램이 정상 방영됩니다.')

nums = []

n = 1

while n < 6:

try:
num = int(input('input Number: '))
except:
print('예외발생!')
continue
nums.append(num)
n += 1

print(f'nums = {nums}')

05 030 예외가 발생하지 않은 경우에 실행하는 구문! / try ~ except ~ else

nums = []
n = 1
while n < 6:

try:
num = int(input('input number: '))

except:
print('예외 발생')
continue # 카운트 되면 안되니까 while 문을 다음 실행으로 넘겨버린다.

else: # 예외가 발생하지 않으면 실행한다.
if num % 2 == 0:
nums.append(num)
n += 1

else:
  print('입력한 숫자는 홀수 입니다.', end = '')
  print('다시 입력 하세요.')
  continue

print(f'숫자들 = {nums}')

실습 - 숫자 5개 입력 받아 짝수 홀수 실수로 구분해서 각각을 리스트에 저장하는 프로그램 만들기

eveList = []; oddList = []; floatList = []

n = 1
while n < 6:

try:
num = float(input('input number: '))

except:
print('exception raise!')
print('input number again')
continue # 카운트가 되면 안된다.

else:
if num - int(num) != 0:
print('float number!')
floatList.append(num)

else:
  if num % 2 == 0:
    print('even number')
    eveList.append(int(num))
    
  else:
    print('odd number')
    oddList.append(int(num))
    
n += 1

print(f'짝수들 = {eveList}')
print(f'홀수들 = {oddList}')
print(f'실수들 = {floatList}')

05 031 finally / 예외 발생과 상관없이 항상 실행한다.

try :
inputData = input('input number: ')
numInt = int(inputData)
except:
print('Exception rise!!!')
print('Not Number!!!')

else:
if numInt % 2 == 0:
print('even number!!!')
else: print('odd number!!!')

finally:
print(f'Input Data: {inputData}')

eveList = []; oddList = []; floatList = []; dataList = []

n = 1
while n < 6:

try:
data = input('input number: ')
floatNum = float(data)

except:
print('Exception rise!!')
print('Not Number!!')
continue

else:
if floatNum - int(floatNum) != 0:
print('float number!!')
floatList.append(floatNum)

else: 
  if floatNum % 2 == 0:
    print('even number!!')
    eveList.append(int(floatNum))
    
  else: 
    print('odd number!!')
    oddList.append(int(floatNum))
    
n += 1

finally:
dataList.append(data)

print(f'짝수 = {eveList}')
print(f'홀수 = {oddList}')
print(f'실수 = {floatList}')
print(f'모든 데이터 = {dataList}')

05 032 exception 클래스 / exception은 예외를 담당하는 클래스이다

num1 = int(input('input number: '))
num2 = int(input('input number: '))

try:
print(f'num1 / num2 = {num1 / num2}')

except Exception as e:
print('0으로 나눌 수 없음.')
print(f'exception : {e}')

finally:
print(f'모든 데이타: {num1, num2}')

print(f'num1 num2 = {num1 num2}')
print(f'num1 - num2 = {num1 - num2}')
print(f'num1 + num2 = {num1 + num2}')

raise / exception 객체 생성을 한 후 예외 발생시키기 -> 이해 안됨

def divCalculator(n1, n2):

if n2 != 0:
print(f'{n1} / {n2} = {n1 / n2}')
else:
raise Exception('0으로 나눌 수 없습니다.')

num1 = int(input('input number1: '))
num2 = int(input('input number2: '))

try:
divCalculator(num1, num2)
except Exception as e:
print(f'Exception: {e}')

def sendSMS(msg):

if len(msg) > 10:
raise Exception('길이 초과!! MMS 전환 후 발송!!', 1)

else:
print('SMS 발송')

def sendMMS(msg):
if len(msg) <= 10:
raise Exception('길이 미달!! SMS 전환 후 발송!!', 2)
else:
print('MMS 발송!!')

msg = input('input message: ')

try:
sendSMS(msg)

except Exception as e:
print(f'e: {e.args[0]}')
print(f'e: {e.args[1]}')

if e.args[1] == 1:
sendMMS(msg)
elif e.args[1] == 2:
sendMMS(msg)

profile
데이터 분석가

0개의 댓글