Day 13 - Abstract Classes

Abstract Base Class라는 개념에 대해서 수업에서 배웠는데, 이를 활용할 수 있는 HackerRank의 문제다.

문제 해석

  • Book과 Solution이라는 주어진 클래스에 대해, 다음과 같은 것을 수행하는 클래스 MyBook을 만들어라.
    • Book을 상속할 것
    • 생성자에 title(str), author(str), price(int)라는 세 매개변수를 가질 것
    • Book 클래스의 display()라는 메소드를 출력해서 다음의 3개 줄이 출력되도록 할 것
      • Title:, 공백, 현 instance의 title
      • Author:, 공백, 현 instance의 author
      • Price:, 공백, 현 instance의 price

문제 풀이

  • 이번 챌린지는 비교적 간단하다. Book이라는 상위클래스에서 title, author의 initializer 을 상속받고, price는 상위클래스에 없는 매개변수이므로 따로 객체 변수로 지정해주면 된다. 그리고display라는 메소드를 override하여 위 출력을 작동시키면 된다.
    1
    2
    3
    4
    5
    6
    7
    from abc import ABCMeta, abstractmethod
    class Book(object, metaclass=ABCMeta):
    def __init__(self,title,author):
    self.title=title
    self.author=author
    @abstractmethod
    def display(): pass
  • 이것이 이미 주어져있는 Book이라는 Abstract Class이므로 이걸 상속받고 위의 요구사항들을 충족하는 하위클래스는 다음과 같은 코드로 표현할 수 있다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class MyBook(Book):
    def __init__(self, title, author, price):
    Book.__init__(self, title, author)
    self.price = price

    def display(self):
    print("Title:", self.title)
    print("Author:", self.author)
    print("Price:", self.price)
  • print라는 메소드에 쉼표로 연결하면 공백이 자동으로 생기는 것을 이용하여 객체의 instance variable 앞에 각각 필요한 string을 넣어 출력해주었다.

느낀 점

간단하게 상속과 override를 배울 수 있는 문제였다.
print가 세번 반복되는 걸 줄일 수 있을까? 효율적인 방법이 생각나지 않아서 이렇게 했는데…