answer11_2_2.py

class Ticket:
    """汎用のチケットを表すクラス。継承されることを想定している。

    属性:
        type(str):チケットのタイプ(「汎用」)。
        serial(int):チケットの通し番号。タイプごとに数える。
    """

    _TYPE = "汎用"
    issued = 0

    def __init__(self):
        self.type = self.__class__._TYPE
        self.__class__.issued += 1
        self.serial = self.__class__.issued

    def __str__(self):
        return f"{self.type}チケット #{self.serial}"


class ConcertTicket(Ticket):
    """コンサートチケットを表すクラス。汎用チケットクラスの情報に加え、
    座席の情報(何列何番)を持つ。

    属性:
        type(str):チケットのタイプ(「コンサート」)。
        serial(int):チケットの通し番号。
        seat(str):座席番号(「2列11番」など)。
    """

    _TYPE = "コンサート"
    issued = 0

    def __init__(self, seat):
        super().__init__()
        self.seat = seat

    def __str__(self):
        return f"{self.type}チケット #{self.serial} 座席{self.seat}"


t1 = ConcertTicket("2列11番")
print(t1)
t2 = ConcertTicket("8列5番")
print(t2)
t3 = ConcertTicket("11列18番")
print(t3)
print(f"発行済チケット数は{ConcertTicket.issued}枚です!")

# 章末問題 11章【2】(2)解答例
#
# Ticketクラスを継承するために、class ConcertTicket(Ticket)とします
# (21行目)。クラス変数_TYPEとissuedはTicketクラスとは別に独自で
# 持ちます(31〜32行目)。
#
# 初期化メソッド__init__では(34行目〜)、まずsuperを用いて(35行目)
# 親クラスに定義された初期化を行ってtypeとserialを設定し、続いて
# このクラス独自のseatの設定を行います(36行目)。
#
# メソッド__str__では(38行目〜)、f文字列を使ってtype、serial、seatを
# 埋め込みました。文字列の前半が親であるTicketクラスの__str__が返すものと
# 同じなので、それを利用して以下のようにしてもよいでしょう。
#
#       return f"{super().__str__()} 座席{self.seat}"