クラス

プログラムが大きく複雑になるにつれ、コードの管理や整理が非常に困難になることがあります。関数や変数がプログラムのさまざまな部分に散らばってしまい、何が起こっているのか把握しづらく、結果として散らかった保守しにくいコードになってしまいます。ここで登場するのが、オブジェクト指向プログラミングの中核であるクラスです。
💡
クラスは、関連するデータ関数をまとめて「オブジェクト」を作成する方法です。 クラスはオブジェクト指向プログラミング(OOP)の基本的な概念です。
クラスは、コード内でオブジェクトを作成するための設計図のようなものです。各クラスは、関連するプロパティ(データ)とメソッド(関数)を一つの単位にまとめます。たとえば、ゲームプログラムでは、PlayerMonsterItemといったクラスがあり、それぞれが固有のデータとメソッドを持ちます。これにより、関連する機能がグループ化され、大規模なコードベースでも理解しやすく管理が容易になります。また、各機能がどのように相互作用するかも明確になります。
図書館をモデル化するソフトウェアを作成したいとしましょう。図書館には本があるので、Bookクラスを作成する必要があります:
class Book:
    def __init__(self, title, author, pages):
        self.title = title     # 本のインスタンスにタイトルを割り当てる
        self.author = author   # 本のインスタンスに著者を割り当てる
        self.pages = pages     # 本のインスタンスにページ数を割り当てる
classキーワードは新しいクラスを導入し、その後に名前(Book)が続きます。def __init__(self, title, author, pages):の行はクラスの初期状態、つまりコンストラクタを定義します。ここでオブジェクトが初期化されます。selfはクラスのインスタンスを指します。titleauthorpagesはクラスの属性です。
クラスを関数のように呼び出すことで、新しい本のオブジェクトを作成できます:
# 本の新しいインスタンスを作成する
mockingbird = Book('To Kill a Mockingbird', 'Harper Lee', 281)

print(mockingbird.title)   # To Kill a Mockingbird
print(mockingbird.author)  # Harper Lee
print(mockingbird.pages)   # 281
To Kill a MockingbirdHarper Lee281を引数として渡していることに注目してください。これらは__init__メソッドに引数として渡されます(ほとんど通常の関数のように)。
Bookクラスのインスタンスを複数作成できます:
# 他の本のインスタンスを作成する
book2 = Book('1984', 'George Orwell', 328)
book3 = Book('The Great Gatsby', author='F. Scott Fitzgerald', pages=180)
book4 = Book('Moby Dick', 'Herman Melville', pages=720)

# 本に関する情報を出力する
print(f'{book2.title} by {book2.author} has {book2.pages} pages.')  # 1984 by George Orwell has 328 pages.
print(f'{book3.title} by {book3.author} has {book3.pages} pages.')  # The Great Gatsby by F. Scott Fitzgerald has 180 pages.
print(f'{book4.title} by {book4.author} has {book4.pages} pages.')  # Moby Dick by Herman Melville has 720 pages.
関数と同様に、__init__メソッドには位置引数とキーワード引数の両方を渡すことができます。
データに加えて、クラスは機能もカプセル化できます。たとえば、図書館システムで本を既読としてマークしたいとします。そのために、Bookクラスにメソッドを定義できます:
class Book:
    def __init__(self, title, author, pages):
        self.title = title     # 本のインスタンスにタイトルを割り当てる
        self.author = author   # 本のインスタンスに著者を割り当てる
        self.pages = pages     # 本のインスタンスにページ数を割り当てる
        self.is_read = False   # 本はまだ読まれていない

    def mark_as_read(self):    # クラスメソッド
        self.is_read = True    # 本を既読としてマークする


mockingbird = Book('To Kill a Mockingbird', 'Harper Lee', 281)
print(mockingbird.is_read)   # False、本はまだ読まれていない
mockingbird.mark_as_read()   # 本を既読としてマークする
print(mockingbird.is_read)   # True、本は読まれた
mark_as_readメソッドは、is_read属性の状態をTrueに変更します。このメソッドはどの本のインスタンスでも呼び出せます。これにより、Pythonのクラスを使用して関連するデータと機能を組み合わせる方法が示されます。
💡
Pythonでは、selfはクラスのインスタンスメソッドの最初のパラメータに使われる慣用的な名前です。これはクラスの現在のインスタンスへの参照です。selfはクラスの定義内で、その属性やメソッドにアクセスするために使用されます。 クラスの新しいオブジェクトを作成すると、Pythonはself引数をその新しいオブジェクトに自動的にバインドします。そのため、インスタンスメソッドを呼び出すときにselfを渡す必要はありません。 selfはPythonの予約語ではありませんが、明確で読みやすいスタイルを促進するために広く使用されています。他の名前を使用することも可能ですが、selfを使用することがコミュニティによって強く推奨されており、ベストプラクティスとされています。

チャレンジ:Carクラスの作成

あなたはCarクラスを作成する任務を担っています。このクラスは次の属性を持つべきです:
  • color(車の色)
  • make(車のブランド)
  • model(車のモデル)
  • year(製造年)
これらの属性はクラスの__init__メソッドで初期化されるべきです。
さらに、Carクラスにはdisplay_detailsメソッドが必要です。このメソッドは車の詳細を[year] [color] [make] [model]の形式で文字列として返すべきです。
入力
出力
c = Car('red', 'Ferrari', 'F8', 2023); print(c.display_details())
2023 red Ferrari F8
c = Car('black', 'Tesla', 'Model S', 2021); print(c.display_details())
2021 black Tesla Model S
 

Constraints

Time limit: 2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue