Pythonクラスにおける「cls」と「self」の違いは何ですか?

PYTHON3 チュートリアル

Pythonのクラスにおける「cls」と「self」の違いについて

Pythonでオブジェクト指向プログラミングを行う際、「cls」と「self」は非常に重要な役割を果たします。これらはクラスメソッドやインスタンスメソッドを定義する際に使われ、クラスやインスタンスのデータにアクセスするための手段を提供します。本記事では、「cls」と「self」の違いを明確にし、それぞれの使い方をサンプルコードを交えて解説します。

「self」とは何か?

「self」は、インスタンスメソッド内で使われる特別な変数で、現在のインスタンスを指します。インスタンスの属性やメソッドにアクセスするために使用されます。

class Dog:
    def __init__(self, name):
        self.name = name
    
    def bark(self):
        return f"{self.name} says woof!"

dog = Dog("Rex")
print(dog.bark())  # 出力: Rex says woof!

上記の例では、「self」はインスタンス「dog」を指し、インスタンスの属性「name」にアクセスしています。

「cls」とは何か?

「cls」は、クラスメソッド内で使われる特別な変数で、クラス自体を指します。クラスメソッドは、クラス全体に対して操作を行うために使用されます。

class Dog:
    species = "Canis familiaris"
    
    @classmethod
    def get_species(cls):
        return cls.species

print(Dog.get_species())  # 出力: Canis familiaris

この例では、「cls」はクラス「Dog」を指しており、クラス属性「species」にアクセスしています。

「self」と「cls」の違い

「self」はインスタンスを指し、「cls」はクラスを指します。インスタンスメソッドは「self」を引数として受け取り、インスタンスのデータにアクセスします。一方、クラスメソッドは「cls」を引数として受け取り、クラス自体のデータにアクセスします。

応用例

以下の例では、「self」と「cls」を組み合わせて使い、クラス全体と個々のインスタンスの両方に対して操作を行っています。

class Dog:
    species = "Canis familiaris"
    dogs_created = 0
    
    def __init__(self, name):
        self.name = name
        Dog.dogs_created += 1
    
    @classmethod
    def get_dogs_created(cls):
        return cls.dogs_created
    
    def bark(self):
        return f"{self.name} says woof!"

dog1 = Dog("Rex")
dog2 = Dog("Buddy")
print(dog1.bark())  # 出力: Rex says woof!
print(Dog.get_dogs_created())  # 出力: 2

この例では、インスタンスが作成されるたびに「dogs_created」が増加し、「cls」を使ってクラス全体のインスタンス数を取得しています。

以上のように、「self」と「cls」はそれぞれ異なる目的で使用され、Pythonのクラス設計において重要な役割を担っています。これらを理解することで、より効果的なオブジェクト指向プログラミングが可能になります。

「cls」と「self」は、Pythonのクラス内で使用される特別なキーワードです。主な違いは以下の通りです:

1. 「self」は、インスタンス自身を指すキーワードです。メソッド内で使用され、そのメソッドが呼び出されたインスタンス自身を操作するために使用されます。

2. 「cls」は、クラス自体を指すキーワードです。主にクラスメソッド内で使用され、そのクラス全体に対して操作を行うために使用されます。通常、クラスメソッド内では「cls」を使用してクラス変数や他のクラスメソッドにアクセスします。

つまり、「self」はインスタンスを指し、「cls」はクラスを指すという違いがあります。適切に使用することで、Pythonのクラスを効果的に操作することができます。

購読
通知
0 Comments
Inline Feedbacks
View all comments