클래스는 class 키워드와 속성(변수) 그리고 기능(함수)를 이용해서 만든다.
__init__ -> 생성자, 속성
그외 함수들은 기능
#object.py
class Car:
def __init__(self,col,len):
self.color = col
self.length = len
def doStop(self):
print('STOP!!')
def doStart(self):
print('START!!')
def printCarInfo(self):
print(f'self.color : {self.color}')
print(f'self.length : {self.length}')
car1 = Car('red', 200)
car2 = Car('blue', 300)
car1.printCarInfo()
car2.printCarInfo()
car1.doStop()
클래스를 호출할떄 car1 = Car('red',200) 으로 car1 객체를 생성하면서 자동으로 init 메서드가 실행되고 color = 'red', length = 200으로 초기화 됨.
클래스는 또 다른 클래스를 상속해서 내것처럼 사용할수 있음.
클래스를 상속할때는 자식 클래스 옆 괄호안에 부모 클래스를 넣어 주면 된다.
자식클래스에서 부모클래스의 기능을 사용할수 있게 되는것임.
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()
다중상속은 상속과 마찬가지로 하나더 넣어주면 다중 상속이 됨.
ex)
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.fly()
myCar.turbo()
Car 클래스에서 Car01 과 Car02와 Car03 기능을 사용할수 있음 => 다중상속
객체가 생성될떄 생성자를 호출하면 init()가 자동 호출된다.
#object.py
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, pNum1, pNum2)
super().__init__(cNum1,cNum2)
self.cNum1 = cNum1
self.cNum2 = cNum2
C_Class 객체를 선언하면 C_Class의 __init__메서드가 실행되지 P_Class의__init__메서드는 실행되지 않는다.
이걸 해주려면 강제로
# P_Class.__init__(self, cNum1, cNum2)
이렇게 해주면 P_Class 객체가 초기화되면서 pNum1, pNum2를 사용가능하지만
super()메서드를 사용해서 나타낼수도 있음.
super().__init__(cNum1,cNum2)
이렇게도 사용할수 있다.
오버리이딩은 하위클래스에서 상위 클래스의 메서드를 재 정의 하는것임.
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('레이저 발사')
myRobot = NewRobot('red',250,100)
myRobot.printRobotInfo()
myRobot.fire()
부모클래스의 fire 함수를 자식클래스에서 재정의 하여 사용
상위 클래스에서 하위클래스에 메서드 구현을 강요하는것
이 기능은 꼭 상속해서 구현해야 돼 ~
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('시속 400KM/h 비행!!')
class fighterPlane(Airplane):
def __init__(self,c):
self.color = c
def flight(self):
print('시속 700Km/h 비행!!')
al = Airliner('red')
al.flight()
al.forward()
al.backward()
1) 예외
예외는 문법적인 문제는 없으나 실행 중 발생하는 예상하지 못한 문제
evenList = []; oddList = []; floatList = []; dataList = []
n = 1
while n < 6:
try :
data = input('input number : ')
floatNum = float(data)
except:
print('exception raise!!!')
print('not number!!')
continue
else:
if floatNum - int(floatNum) != 0:
print('float number!!!')
floatList.append(floatNum)
else:
if floatNum % 2 == 0:
print('even number!!!')
evenList.append(floatNum)
else:
print('odd number !!!')
oddList.append(floatNum)
n += 1
finally:
dataList.append(data)
print(f'evenList : {evenList}')
print(f'oddList : {oddList}')
print(f'floatList : {floatList}')
print(f'dataList : {dataList}')
위코드는 숫자를 입력받아서 실수, 짝수, 홀수, datalist에 값을 추가하는 코드이다.
try ~ excepy 구문에서 try문을 실행하고 숫자가 아닌 문자와 같은 입력이 들어오면 예외를 발생시키고 except구문이 실행된다.
if~ else문에서는 실수, 짝수, 홀수를 구분하여 리스트에 저장하고
finally는 어떤 상황이든 반드시 실행이 되는 구문이기 떄문에 숫자가 들어와도, 문자가 들어와도 다 datalist에 저장이 된다.
2) raise
raise 키워드를 이용하면 예외를 발생시킬수 있음.
#exception.py
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:
sendSMS(msg)
위 코드에서 raise Exception을 하면 자동으로 Exception.args가 생성되고 args[0]는 내용이 저장되고 args[1] 에는 1 또는 2가 저장된다.