시작하기에 앞서.... 최대한 정리를 짧게 해보려고 했으나...
하루 수업량이 많아 정리할 내용도 많다!! 내용이 어렵다
벌써 머리 아프면 안 되는데... 적어도 EDA 가서는 머리가 아파야지... 이런
(얕은복사(상단), 깊은 복사(하단))


실습
class TemCls:
def __init__(self, n, s):
self.number = n
self.str = s
def printClsInfo(self):
print(f'self.number: {self.number}')
print(f'self.str: {self.str}')
#얕은복사 실습
tc1 = TemCls(10, 'Hello')
tc2 = tc1
tc1.printClsInfo()
tc2.printClsInfo()#tc1,tc2 동일결과
print('---변경된값 확인----------------------')
tc2.number = 3.14
tc2.str = 'bye'
tc1.printClsInfo()
tc2.printClsInfo()
#깊은 복사
# import copy
# tc1= TemCls(10, 'Hello')
# tc2 = copy.copy(tc1)
#
# print('-----같은값이 출력된다-------')
# tc1.printClsInfo()
# tc2.printClsInfo()
#
# print('------------tc2만 변경된다.-----')
# tc2.number = 3.14
# tc2.str = 'Bye'
#
# tc1.printClsInfo()
# tc2.printClsInfo()


class NormalCar:
def drive(self):
print('[NormalCar] drive() called!!')
def back(self):
print('[NormalCar] back() called!!')
class TurboCar(NormalCar): #괄호()를 사용하여 상속할 클래스명을 적어주자
def turbo(self):
print('[TurboCar] turbo() called')
myTurboCar = TurboCar()
myTurboCar.turbo()
myTurboCar.drive()# NormalCar클래스에서 상속
myTurboCar.back()# NormalCar클래스에서 상속
class Calculator:
def __init__(self):
print('[Calculator] __init__() called!!')
cal = Calculator()#__init__ 자동 호출한다.
class Calculator:
def __init__(self,n1, n2):
print('[Calculator] __init__() called!!')
self.num1 = n1
self.num2 = n2
cal = Calculator(10, 20)#__init__ 자동 호출한다.
print(f'cal.num1:{cal.num1}')
print(f'cal.num2:{cal.num2}')
#다음과 같이 출력된다.
#[Calculator] __init__() called!!
#[Calculator] __init__() called!!
#cal.num1:10
#cal.num2:20
#하나만 넣기
class Calculator:
def __init__(self, n):
print('[Calculator] __init__() called!!')
self.num1 = n
self.num2 = 100
cal = Calculator(3.14)#__init__ 자동 호출한다.
print(f'cal.num1:{cal.num1}')
print(f'cal.num2:{cal.num2}')

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):#배열로 3개를 상속한다.
def __init__(self):
pass
myCar = Car()
myCar.drive()
myCar.turbo()
myCar.fly()

#오버라이딩 예시
class Robot:
def __init__(self, c, h, w):
self.color = c
self.height = h
self.weight = w
def fire(self):
print('미사일 발사!')
def printRobotInfo(self):
print(f'self.color : {self.color}')
print(f'self.height : {self.height}')
print(f'self.weight : {self.weight}')
class NewRobot(Robot):
def __init__(self, c,h,w):
super().__init__(c,h,w)
def fire(self):
print('레이저 발사!')# 상위 fire를 미사일발사에서 레이저 발사로 변경
# 이것이 오버라이딩이다.
myRobot = NewRobot('red', 200, 300)
myRobot.printRobotInfo()
myRobot.fire()

상위 클래스에서 하위 클래스에 메서드 구현을 강요
추상 메소드는 하위 클래스에서 반드시 구현되어야 한다.
추상 메소드를 정의할때는 @abstractmeThod 데코레이더를 사용한다..
from abc import ABCMeta
from abc import abstractmethod
class""(metaclass=ABCMeta)
@abstractmethod
#상위클래스
@abstractmethod #강제 구현
def flight(self):
pass
#하위클래스
def flight(self):
print('시속 400km')
문법에는 문제가 없으나 실행 중 예상치 못한 문제
예를들어 0으로 나누었을때 예외 오류 발생!

예외 관련 클래스는 Exception 클래스를 상속한다.


n1 = 10; n2 = 0
try:
print(n1/n2)
except:
print('예상치 못한 문제가 발생했습니다.')
print('다음 프로그램이 정상 실행됩니다.')
print(n1 * n2)
print(n1 - n2)
print(n1 + n2)
nums = []
n = 1
while n <6:
try:
num = int(input('input number: '))
except:
print('예외 발생!')
continue
else:
if num % 2 ==0:
nums.append(num)
n +=1
else:
print('홀수 입니다.', end ='')
print('다시 입력')
continue
print(f'nums: {nums}')
try:
inputData = input('input number:')
numInt = int(inputData)
except:
print('exception raise!')
print('not number!!')
else:
if numInt % 2 ==0:
print('even number!!')
else:
print('odd number')
finally: #예외든 아니든 실행 된다.
print(f'inputData: {inputData}')
num1 = int(input('input number1:'))
num2 = int(input('input number2:'))
try:
print(f'num1 / num2 = {num1 / num2}')
except Exception as e: #에러 확인
print('0으로 나눌 수 없습니다.')
print(f'exception: {e}')
print('-----------------')
print(f'num1 * num2 = {num1 * num2}')
print(f'num1 - num2 = {num1 - num2}')
print(f'num1 + num2 = {num1 + num2}')
#결과출력 해보면 division by zero 오류를 확인할수 있다.
#input number1:10
#input number2:0
#0으로 나눌 수 없습니다.
#exception: division by zero
#num1 * num2 = 0
#num1 - num2 = 10
#num1 + num2 = 10
#Process finished with exit code 0
class NotUseZeroException(Exception):
def __init__(self, n):
super().__init__(f'{n}은 사용할 수 없습니다.')
def divCalculator(n1, n2):
if n2 ==0:
raise NotUseZeroException(n2)
else:
print(f'{n1} / {n2} = {n1/ n2}')
num1 = int(input('input number1: '))
num2 = int(input('input number2: '))
try:
divCalculator(num1, num2)
except NotUseZeroException as e:
print(e)

with open(uri + '5_037.txt', 'a') as f: #f라 부르겠다.
f.write('python study!!')
with open(uri + '5_037.txt', 'r') as f: #f라 부르겠다.
print(f.read())
#with as로 인해 close()사용 안해도 된다.
languages= ['c/c++', 'java', 'c#', 'python','javascript']
uri = 'C:/pythonTxt/'
for item in languages: #writelines() 함수 사용할때는 반복문 필요없다. 내부적으로 반복가능하게 처리한다.
with open(uri + 'languages.txt', 'a') as f:
# f.write(item)
# f.write('\n')
f.writelines(item +'\n' for item in languages)# item +'n' item을 개행해서 사용
# with open(uri + 'languages.txt', 'r') as f: #r로 읽어 들여보기
#
# print(f.read())# languages.txt를 콘솔에서 출력한다.
#간단 예제
with open(uri + 'lans.txt', 'r') as f:
lanList = f.readlines()# 모든것을 읽어서 리스트로 반환
print(f'lanList: {lanList}')
print(f'lanList type: {type(lanList)}')

