概要
Python3エンジニア認定試験を受験するに当たり、なんとなくの理解だったメソッドについてしっかりと理解したいと思ったので、初心者なりにまとめてみました。
内容の正確性には十分注意しましたが、もし改善点や補足があればコメントいただけると幸いです。
目次
- メソッドとは
- インスタンスメソッドとは
- クラスメソッドとは
- スタティックメソッドとは
- 【まとめ】三種類のメソッドの違い
メソッドとは
特定のオブジェクト(インスタンスまたはクラス)に関連付けられたコードブロック(特定の動作を行うためのコードの集まり)。
【メソッドの特徴】
・クラス内で定義される
・そのクラスのインスタンスやクラスに紐づいて動作する
【メソッドの種類】
Pythonでは、以下の3種類のメソッドがあります。
-
インスタンスメソッド
-
クラスメソッド
-
スタティックメソッド
1. インスタンスメソッドとは
【そもそもインスタンスとは】
インスタンスとは、クラスを基に生成されたオブジェクトのこと。
ざっくりとした例えですが、「人間」というクラスがあるとすれば、「太郎」や「花子」など、クラスから派生したものがインスタンスで、「歩く」「走る」「食べる」など、インスタンスの動作を示したものがインスタンスメソッドです。
クラス: 人間
↓ クラスをもとに生成
インスタンス: 太郎、花子
【インスタンスメソッドの特徴】
・クラスのインスタンスに紐づいて動作する
・第一引数として「self」を受け取る
(第一引数に「self」を記述しないとエラーになる)
・インスタンスのデータ(属性)にアクセスしたり、変更したりする為に使う
・各インスタンスは独自の属性値を持ち、インスタンスメソッドを使ってこれらを操作できる
【インスタンスメソッドの呼び出し方】
インスタンスメソッドは、クラスのインスタンスを通じて呼び出します。
example = Example() # インスタンスを作成
example.instance_method(42) # メソッドを呼び出し
インスタンスメソッドの使用例
class Example:
def instance_method(self, value):
self.value = value # インスタンスの属性を設定
return f"羊が {self.value} 匹"
# インスタンスを作成してメソッドを呼び出す
example = Example()
print(example.instance_method(280)) #出力:羊が 280 匹
インスタンスごとにデータを管理する
class Counter:
def __init__(self):
self.count = 0
def increment(self):
self.count += 1
def reset(self):
self.count = 0
# 使用例
counter1 = Counter()
counter2 = Counter()
counter1.increment()
print(counter1.count) # 出力: 1
print(counter2.count) # 出力: 0 (独立している)
【__init__メソッドとは】
インスタンスメソッドの一種であり、特殊メソッドの一種でもある。
クラス名を定義した後に自動で呼び出されるメソッド。
class Person:
def __init__(self, name, age):
self.name = name # 名前を保存
self.age = age # 年齢を保存
def greet(self):
print(f"Hello, my name is {self.name} and I am {self.age} years old.")
# 使用例
person = Person("Hanako", 30)
person.greet()
# 出力: Hello, my name is Hanako and I am 30 years old.
ここでは詳しい説明は省きますが、特殊メソッドには__init__メソッドの他にも以下のようなものがあります。
・ str : インスタンスの文字列表現を定義
・ repr : デバッグ用の文字列表現を定義
・ add : インスタンス同士の+演算を定義
2. クラスメソッドとは
クラスメソッドは、クラス自体を対象として動作するメソッドです。クラス変数の操作やクラスに関連する処理を行う場合に使います。
【クラスメソッドの特徴】
・第一引数として「cls」を取る
(「cls」はそのメソッドを呼び出したクラスのことで、「self」がインスタンスを表すのに対して、「cls」はクラスを表します。)
・クラス変数の操作やクラスに関連するインスタンス生成を行える
(インスタンスメソッドが各インスタンスごとにデータを管理するのに対して、クラスメソッドはクラス全体でデータを管理します)
・クラスメソッドを定義する際には、メソッドの上に「@classmethod」(デコレーター)を付ける必要がある
クラスメソッドの使用例
class MyClass:
class_variable = "Class Level Variable"
@classmethod
def show_class_variable(cls):
print(f"Class Variable: {cls.class_variable}")
MyClass.show_class_variable()
# 出力: Class Variable: Class Level Variable
クラスメソッドのメリットは、クラス全体に関連する処理をカプセル化できること、継承を考慮した設計に役立つため、クラスの柔軟性と再利用性を向上させられることなどがあります。
3. スタティックメソッドとは
スタティックメソッドは、クラスやインスタンスに依存しないメソッドです。クラスの一部として定義されますが、クラスやインスタンスの状態(変数や属性)にアクセスしない場合に使います。
また、スタティックメソッドは論理的な関連性を持つ処理を整理し、コードの可読性と再利用性を向上させます。
・「self」や「cls」などのクラスやインスタンスに依存しないため、クラスやインスタンスの状態を直接参照または変更できない
・スタティックメソッドであることを明示するために、「@staticmethod」(デコレーター)を付ける必要がある
スタティックメソッドの使用例
class MathOperations:
@staticmethod
def add(a, b):
return a + b
print(MathOperations.add(5, 3)) # 出力: 8
instance = MathOperations()
print(instance.add(10, 20)) # 出力: 30
スタティックメソッドとして定義することで、この処理がMathクラスに関連する計算処理であることを明示できます。
# クラス外の関数
def add(a, b):
return a + b
# クラス内のスタティックメソッド
class Math:
@staticmethod
def add(a, b):
return a + b
# 使用例
print(add(3, 5)) # 出力: 8
print(Math.add(3, 5)) # 出力: 8
スタティックメソッドのメリットは、そのメソッドが特定のクラスに関連しているが、状態に依存しないことを明確にできること、他のクラスやモジュールから直接呼び出して利用でき、独立した関数としての再利用性が高いことなどです。
クラスに関連する処理だが、クラスやインスタンスの状態に依存しない場合に使われます。
【まとめ】三種類のメソッドの違い
インスタンスメソッド、クラスメソッド、スタティックメソッドの大きな違いを表にまとめました。
| メソッドの種類 | 第一引数 | クラスやインスタンスの状態にアクセス | 主な用途 |
|---|---|---|---|
| インスタンスメソッド | self |
可能 | インスタンス固有の動作を定義 |
| クラスメソッド | cls |
クラス変数のみアクセス可能 | クラス全体に関連する処理を定義 |
| スタティックメソッド | なし | 不可能 | クラスに関連するが独立した処理 |
class Example:
# クラス変数(クラス全体で共有される)
class_variable = "I am a class variable"
def __init__(self, instance_variable):
# インスタンス変数(インスタンスごとに異なる)
self.instance_variable = instance_variable
# インスタンスメソッド
def instance_method(self):
print(f"Accessing instance variable: {self.instance_variable}")
print(f"Accessing class variable from instance method: {Example.class_variable}")
# クラスメソッド
@classmethod
def class_method(cls):
print(f"Accessing class variable from class method: {cls.class_variable}")
# clsを使ってクラスレベルの操作を行うことが可能
# スタティックメソッド
@staticmethod
def static_method():
print("Static method does not access instance or class variables.")
# インスタンスを作成
example1 = Example("Instance 1")
# 1. インスタンスメソッドの呼び出し
example1.instance_method()
# 出力:
# Accessing instance variable: Instance 1
# 出力:
# Accessing class variable from instance method: I am a class variable
# 2. クラスメソッドの呼び出し
Example.class_method()
# 出力:
# Accessing class variable from class method: I am a class variable
# 3. スタティックメソッドの呼び出し
Example.static_method()
# 出力:
# Static method does not access instance or class variables.
インスタンスメソッドにはインスタンスに依存する処理を記述する。
クラスメソッドにはクラス全体に影響を与える処理を記述する。
スタティックメソッドにはクラスやインスタンスに依存しない汎用的な処理を記述する。
メソッドの特性に応じて3種類のメソッドを巧みに使い分けられるようになりたいものです。