본문 바로가기

파이썬 Python

초급 10, 11 클래스와 상속

클래스 정의

class Car:

    def __init__(self, seat, handle_size, wheel, luggage):
        self.seat = seat
        # __속성명: private
        self.__handle_size = handle_size
        self.wheel = wheel
        # _속성명: protected
        self._luggage = luggage
        print("Car.__init__")

    def honk(self):
        print("빵빵")

    def drive(self):
        print("자동차가 출발합니다")

    def load_luggage(self, luggage):
        if luggage > self._luggage:
            print("적재물이 너무 많습니다")
        else:
            print("자동차에 " + luggage + "만큼의 짐을 싣습니다")

    def __str__(self):  # str()을 override
        return str(self.__dict__)


class Truck(Car):
    def __init__(self, seat, handle_size, wheel, luggage):
        super().__init__(seat, handle_size, wheel, luggage)
        print("Truck.__init__")

    # Override
    def drive(self):
        print("출발합니다. 적재함 고정이 잘 되었는지 확인하세요")


class Sedan(Car):

    def __init__(self, seat, handle_size, wheel, luggage):
        super().__init__(seat, handle_size, wheel, luggage)
        print("Sedan.__init__")

    def drive(self):
        super().drive()
        print("안전 운전 하세요")


class Bus(Car):

    def __init__(self, seat, handle_size, wheel, luggage):
        super().__init__(seat, handle_size, wheel, luggage)
        print("Bus.__init__")

    def drive(self):
        super().drive()
        print("승객의 안전띠를 확인해 주세요")

 

In:

cars = list()
cars.append(Car(4, 300, 4, 300))
cars.append(Truck(4, 450, 4, 1000))
cars.append(Sedan(4, 300, 4, 300))
cars.append(Bus(25, 480, 4, 0))

for i in cars:
    print(i)
    print(type(i))
    i.drive()
    # 속성 추가, Car의 __handle_size와 별개의 새로운 속성이 생성됨
    # 기존 handle_size 속성의 이름은 _Car__handle_size
    i.__handle_size = 200
    print(i.__handle_size)
    print(i._Car__handle_size)  # Python의 경우 protected와 private이 엄격하게 지켜지지 않으므로 접근이 가능하긴 함
    i.handle_size = 200
    print(i)
    print()

Out:

Car.__init__
Car.__init__
Truck.__init__
Car.__init__
Sedan.__init__
Car.__init__
Bus.__init__
{'seat': 4, '_Car__handle_size': 300, 'wheel': 4, 'luggage': 300}
<class '__main__.Car'>
자동차가 출발합니다
200
300
{'seat': 4, '_Car__handle_size': 300, 'wheel': 4, 'luggage': 300, '__handle_size': 200, 'handle_size': 200}

{'seat': 4, '_Car__handle_size': 450, 'wheel': 4, 'luggage': 1000}
<class '__main__.Truck'>
출발합니다. 적재함 고정이 잘 되었는지 확인하세요
200
450
{'seat': 4, '_Car__handle_size': 450, 'wheel': 4, 'luggage': 1000, '__handle_size': 200, 'handle_size': 200}

{'seat': 4, '_Car__handle_size': 300, 'wheel': 4, 'luggage': 300}
<class '__main__.Sedan'>
자동차가 출발합니다
안전 운전 하세요
200
300
{'seat': 4, '_Car__handle_size': 300, 'wheel': 4, 'luggage': 300, '__handle_size': 200, 'handle_size': 200}

{'seat': 25, '_Car__handle_size': 480, 'wheel': 4, 'luggage': 0}
<class '__main__.Bus'>
자동차가 출발합니다
승객의 안전띠를 확인해 주세요
200
480
{'seat': 25, '_Car__handle_size': 480, 'wheel': 4, 'luggage': 0, '__handle_size': 200, 'handle_size': 200}

 

In:

class Car:

    def __init__(self, seat, handle_size, wheel, luggage):
        self.seat = seat
        # __속성명: private
        self.__handle_size = handle_size
        self.wheel = wheel
        # _속성명: protected
        self._luggage = luggage
        print("Car.__init__")

    def honk(self):
        print("빵빵")

    def drive(self):
        print("자동차가 출발합니다")

    def load_luggage(self, luggage):
        if luggage > self._luggage:
            print("적재물이 너무 많습니다")
        else:
            print("자동차에", luggage, "만큼의 짐을 싣습니다")

    def __str__(self):
        return str(self.__dict__)


class Truck(Car):
    def __init__(self, seat, handle_size, wheel, luggage):
        super().__init__(seat, handle_size, wheel, luggage)
        print("Truck.__init__")

    # Override
    def drive(self):
        print("출발합니다. 적재함 고정이 잘 되었는지 확인하세요")


class Sedan(Car):

    def __init__(self, seat, handle_size, wheel, luggage):
        super().__init__(seat, handle_size, wheel, luggage)
        print("Sedan.__init__")

    def drive(self):
        super().drive()
        print("안전 운전 하세요")


class Bus(Car):

    def __init__(self, seat, handle_size, wheel, luggage):
        super().__init__(seat, handle_size, wheel, luggage)
        print("Bus.__init__")

    def drive(self):
        super().drive()
        print("승객의 안전띠를 확인해 주세요")


cars = list()
cars.append(Car(4, 300, 4, 300))
cars.append(Truck(4, 450, 4, 1000))
cars.append(Sedan(4, 300, 4, 300))
cars.append(Bus(25, 480, 4, 0))

for i in cars:
    print(i)
    print(type(i))
    i.drive()
    i.load_luggage(250)
    i.load_luggage(1100)
    print()

Out:

Car.__init__
Car.__init__
Truck.__init__
Car.__init__
Sedan.__init__
Car.__init__
Bus.__init__
{'seat': 4, '_Car__handle_size': 300, 'wheel': 4, '_luggage': 300}
<class '__main__.Car'>
자동차가 출발합니다
자동차에 250 만큼의 짐을 싣습니다
적재물이 너무 많습니다

{'seat': 4, '_Car__handle_size': 450, 'wheel': 4, '_luggage': 1000}
<class '__main__.Truck'>
출발합니다. 적재함 고정이 잘 되었는지 확인하세요
자동차에 250 만큼의 짐을 싣습니다
적재물이 너무 많습니다

{'seat': 4, '_Car__handle_size': 300, 'wheel': 4, '_luggage': 300}
<class '__main__.Sedan'>
자동차가 출발합니다
안전 운전 하세요
자동차에 250 만큼의 짐을 싣습니다
적재물이 너무 많습니다

{'seat': 25, '_Car__handle_size': 480, 'wheel': 4, '_luggage': 0}
<class '__main__.Bus'>
자동차가 출발합니다
승객의 안전띠를 확인해 주세요
적재물이 너무 많습니다
적재물이 너무 많습니다

 

클래스 Truck에서 load_luggage()를 오버라이드 한 후 실행해본다.

class Truck(Car):
    def __init__(self, seat, handle_size, wheel, luggage):
        super().__init__(seat, handle_size, wheel, luggage)
        print("Truck.__init__")

    # Override
    def drive(self):
        print("출발합니다. 적재함 고정이 잘 되었는지 확인하세요")

    def load_luggage(self, luggage):
        if luggage > (self._luggage + (self._luggage * 0.10)):
            print("적재물이 너무 많습니다.")
        else:
            print("자동차에", luggage, "만큼의 짐을 싣습니다")

Out:

{'seat': 4, '_Car__handle_size': 450, 'wheel': 4, '_luggage': 1000}
<class '__main__.Truck'>
출발합니다. 적재함 고정이 잘 되었는지 확인하세요
자동차에 250 만큼의 짐을 싣습니다
자동차에 1100 만큼의 짐을 싣습니다

 

Setter, Getter

함수를 꾸며주는 @(decorator)

함수 위에 @property를 붙이면 getter 역할을 하고 @속성.setter를 붙이면 setter 역할을 한다.

 

클래스 Car에 getter와 setter 함수를 추가한다.

class Car:

    def __init__(self, seat, handle_size, wheel, luggage):
        self.seat = seat
        # __속성명: private
        self.__handle_size = handle_size
        self.__wheel = wheel
        # _속성명: protected
        self._luggage = luggage
        print("Car.__init__")

    def honk(self):
        print("빵빵")

    def drive(self):
        print("자동차가 출발합니다")

    def load_luggage(self, luggage):
        if luggage > self._luggage:
            print("적재물이 너무 많습니다")
        else:
            print("자동차에", luggage, "만큼의 짐을 싣습니다")

    def __str__(self):
        return str(self.__dict__)

    @property
    def wheel(self):
        return self.__wheel

    @wheel.setter
    def wheel(self, wheel):
        if wheel > 1:
            self.__wheel = wheel

In:

cars = list()
cars.append(Car(4, 300, 4, 300))
cars.append(Truck(4, 450, 4, 1000))
cars.append(Sedan(4, 300, 4, 300))
cars.append(Bus(25, 480, 4, 0))

cars[2].wheel = 1
print(cars[2].wheel)
cars[2].wheel = 6
print(cars[2].wheel)

Out:

4
6

 

'파이썬 Python' 카테고리의 다른 글

[Python] 중급 1 문자열  (0) 2021.02.25
[Python] 초급 12 클래스 예제  (0) 2021.02.21
초급 9 XML  (0) 2021.01.15
초급 8 REST, JSON  (0) 2021.01.14
초급 7 딕셔너리, 프로그램 설계  (0) 2021.01.14