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}"