クラス
プログラムが大きく複雑になるにつれ、コードの管理や整理が非常に困難になることがあります。関数や変数がプログラムのさまざまな部分に散らばってしまい、何が起こっているのか把握しづらく、結果として散らかった保守しにくいコードになってしまいます。ここで登場するのが、オブジェクト指向プログラミングの中核であるクラスです。
💡
クラスは、関連するデータと関数をまとめて「オブジェクト」を作成する方法です。
クラスはオブジェクト指向プログラミング(OOP)の基本的な概念です。
クラスは、コード内でオブジェクトを作成するための設計図のようなものです。各クラスは、関連するプロパティ(データ)とメソッド(関数)を一つの単位にまとめます。たとえば、ゲームプログラムでは、
Player
、Monster
、Item
といったクラスがあり、それぞれが固有のデータとメソッドを持ちます。これにより、関連する機能がグループ化され、大規模なコードベースでも理解しやすく管理が容易になります。また、各機能がどのように相互作用するかも明確になります。図書館をモデル化するソフトウェアを作成したいとしましょう。図書館には本があるので、
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
はクラスのインスタンスを指します。title
、author
、pages
はクラスの属性です。クラスを関数のように呼び出すことで、新しい本のオブジェクトを作成できます:
# 本の新しいインスタンスを作成する
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 Mockingbird
、Harper Lee
、281
を引数として渡していることに注目してください。これらは__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