始める無料で始める

代替コンストラクタ

Python では、@classmethod デコレータと特別な第1引数 cls を使ってクラスのメソッドも定義できます。クラスメソッドの主な用途は、__init__() と同じコードを使わずに、そのクラスのインスタンスを返すメソッドを定義することです。

たとえば、時系列パッケージを開発していて、日付を扱うための独自クラス BetterDate を作りたいとします。このクラスの属性は yearmonthday です。年・月・日を値として受け取り 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)
コードを編集して実行