クラス

プログラムが大きく複雑になるにつれ、コードの管理や整理が非常に困難になることがあります。関数や変数がプログラムのさまざまな部分に散らばってしまい、何が起こっているのか把握しづらく、結果として散らかった保守しにくいコードになってしまいます。ここで登場するのが、オブジェクト指向プログラミングの中核であるクラスです。

クラスは、コード内でオブジェクトを作成するための設計図のようなものです。各クラスは、関連するプロパティ(データ)とメソッド(関数)を一つの単位にまとめます。たとえば、ゲームプログラムでは、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のクラスを使用して関連するデータと機能を組み合わせる方法が示されます。

チャレンジ: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