Pythonのクラスにおける「self」とは?意味と使い方を徹底解説
はじめに
このチュートリアルでは、Pythonにおけるselfについて詳しく解説します。Pythonで開発をしている方なら、必ず目にしたことがあるはずの存在です。この記事では、selfの基本的な役割から、あまり知られていない興味深い性質までをわかりやすく紹介していきます。
注意 − selfはPythonの予約語(キーワード)ではありません。
まずは、Pythonにおけるselfの最も一般的な使われ方から見ていきましょう。
selfの基本的な役割
クラスの中では、selfを使ってオブジェクトのインスタンス自身を表します。1つのクラスから複数のインスタンスを作成でき、それぞれのインスタンスは異なる値を持つことができます。selfがあることで、クラス内部から各インスタンス固有のプロパティ(属性)にアクセスできるようになります。実際の例を見てみましょう。
例
# クラスの定義
class Laptop:
# 初期化メソッド
def __init__(self, company, model):
# self
self.company = company
self.model = model
このように、クラスのプロパティはself.○○という形式で定義します。こうすることで、クラスのインスタンスを作成するたびに、selfが「プロパティやメソッドへアクセスしているそのインスタンス」を指すようになります。
それでは、Laptopクラスのインスタンスを2つ作成し、selfがどのように機能するのかを確認してみましょう。
例
# クラスの定義
class Laptop:
# 初期化メソッド
def __init__(self, company, model):
# self
self.company = company
self.model = model
# Laptopクラスのインスタンスを作成
laptop_one = Laptop('Lenovo', 'ideapad320')
laptop_two = Laptop('Dell', 'inspiron 7000')
# インスタンスのプロパティを出力
print(f"Laptop One: {laptop_one.company}")
print(f"Laptop Two: {laptop_two.company}")
実行結果
上記のコードを実行すると、次のような結果が得られます。
Laptop One: Lenovo Laptop Two: Dell
同じプロパティなのに、2つの異なる値が出力されました。その裏側の仕組みを詳しく見ていきましょう。
selfが動作する仕組み
Pythonでは、インスタンスのメソッドやプロパティにアクセスする際、デフォルトでそのインスタンスへの参照(リファレンス)が自動的に渡されます。この参照を受け取るのがselfです。インスタンスごとに参照は異なるため、それぞれのインスタンスが持つプロパティの値を正しく取得できるのです。
先述のとおり、selfはPythonのキーワードではありません。むしろ、インスタンスのプロパティやメソッドにアクセスするときに、自分で渡す必要のない「引数」のようなものです。
Pythonが自動的にインスタンスへの参照を渡してくれるため、この参照は実は任意の変数名で受け取ることができます。次のコードを実行して、その挙動を確認してみてください。
例
# クラスの定義(self以外の名前を使用)
class Laptop:
# 初期化メソッド
def __init__(other_than_self, company, model, colors):
other_than_self.company = company
other_than_self.model = model
other_than_self.colors_available = colors
# メソッド(こちらもself以外の名前を使用)
def is_laptop_available(not_self_but_still_self, color):
# 指定した色のノートPCが利用可能かどうかを返す
return color in not_self_but_still_self.colors_available
# クラスのインスタンスを作成
laptop = Laptop('Dell', 'inspiron 7000', ['Silver', 'Black'])
# 色を指定してis_laptop_availableメソッドを呼び出す
print("Available") if laptop.is_laptop_available('Silver') else print("Not available")
print("Available") if laptop.is_laptop_available('White') else print("Not available")
実行結果
上記のコードを実行すると、次のような結果が得られます。
Available Not available
この例では、selfという名前を別の名前(other_than_selfやnot_self_but_still_self)に変更しました。それでも、コードは以前とまったく同じように動作しており、違いは一切ありません。つまり、selfはキーワードではなく、好きな名前に自由に変更できる「ただの引数」だということがわかります。
注意 − ただし、実際の開発ではselfという名前を使うのがベストプラクティスです。すべてのPythonプログラマーが従っている標準的な慣習なので、これに合わせておきましょう。
まとめ
この記事では、Pythonにおけるselfについて学びました。重要なポイントをおさらいします。
- selfはクラス内でインスタンス自身を表すために使用される
- selfはPythonの予約語ではなく、単なる引数として扱われる
- メソッド呼び出し時、Pythonが自動的にインスタンスへの参照を渡してくれる
- 名前は変更可能だが、可読性の観点からselfを使うのが標準的な慣習
本チュートリアルの内容についてご不明な点がありましたら、コメント欄にてお気軽にご質問ください。
-
Python Kivy入門:ボタンアクション(イベント処理)の実装方法
Kivyは、マルチタッチアプリなど革新的なユーザーインターフェースを持つアプリケーションを迅速に開発するためのオープンソースのPythonライブラリです。Androidアプリだけでなく、デスクトップアプリケーションの開発にも広く活用されています。本記事では、Kivyにおいてボタンが押されたときにイベントを発生させる方法について解説します。実装例:ボタンとラベルの連動以下の例では、水平方向のBoxLayoutの中にボタンとラベルを1つずつ配置しています。まず、ボタンとラベルにそれぞれ初期テキストを設定します。その後、ボタンをクリックした際に発火するイベントを作成し、このイベントによってボタンとラ
-
Pythonの継承とは?単一継承と階層継承の基本をサンプルコードで解説
本記事では、Python 3.xにおける継承(インヘリタンス)とクラスの拡張方法について詳しく解説します。 継承とは、現実世界のモノや概念の関係性を自然に表現できる、オブジェクト指向プログラミングの中核となる仕組みです。継承を活用すると、次のようなメリットが得られます。 再利用性:すでに書いたコードを流用でき、重複を削減できる 推移性:クラス間の関係を連鎖的に引き継げる 開発速度の向上:ゼロから書かずに済むため、短期間で開発できる 保守性・拡張性:既存クラスを壊さずに機能を追加しやすい 継承の5つの種類 Pythonの継承は、その構造によって主に以下の5種類に分類されます。 単一継承(