파이썬 중급 (2)

이창영·2023년 10월 20일

ZB_Data_20

목록 보기
3/9

1. class

클래스는 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으로 초기화 됨.

2. 상속

클래스는 또 다른 클래스를 상속해서 내것처럼 사용할수 있음.

클래스를 상속할때는 자식 클래스 옆 괄호안에 부모 클래스를 넣어 주면 된다.

자식클래스에서 부모클래스의 기능을 사용할수 있게 되는것임.

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 기능을 사용할수 있음 => 다중상속

3. 생성자

객체가 생성될떄 생성자를 호출하면 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)

이렇게도 사용할수 있다.

4. 오버라이딩

오버리이딩은 하위클래스에서 상위 클래스의 메서드를 재 정의 하는것임.

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 함수를 자식클래스에서 재정의 하여 사용

5. 추상 클래스

상위 클래스에서 하위클래스에 메서드 구현을 강요하는것

이 기능은 꼭 상속해서 구현해야 돼 ~

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()

6. 예외 처리

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가 저장된다.

profile
AI개발자를 꿈꾸는 개발자 이창영 입니다.

0개의 댓글