代替コンストラクタ
Python では、@classmethod デコレータと特別な第1引数 cls を使ってクラスのメソッドも定義できます。クラスメソッドの主な用途は、__init__() と同じコードを使わずに、そのクラスのインスタンスを返すメソッドを定義することです。
たとえば、時系列パッケージを開発していて、日付を扱うための独自クラス BetterDate を作りたいとします。このクラスの属性は year、month、day です。年・月・日を値として受け取り BetterDate オブジェクトを生成するコンストラクタに加えて、2020-04-30 のような文字列からも BetterDate オブジェクトを作れるようにしたいと考えています。
次の関数が役に立つかもしれません。
.split("-")メソッドは文字列を"-"で分割して配列にします。例:"2020-04-30".split("-")は["2020", "04", "30"]を返します。int()は文字列を数値に変換します。例:int("2019")は2019です。
この演習はコースの一部です
Python によるオブジェクト指向プログラミング
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
class BetterDate:
# Constructor
def __init__(self, year, month, day):
# Recall that Python allows multiple variable assignments in one line
self.year, self.month, self.day = year, month, day
# Define a class method from_str
____
def from_str(____, datestr):
# Split the string at "-" and convert each part to integer
parts = datestr.split("-")
year, month, day = int(parts[0]), ____, ____
# Return the class instance
____ ____(____, ____, ____)
bd = BetterDate.from_str('2020-04-30')
print(bd.year)
print(bd.month)
print(bd.day)