python_カスタムのclassでの_インスタンス・メソッド宣言での self


pythonにおいて カスタムのクラスを作成し、

その内部でインスタンス・メソッドを定義するとき、


def method01( self ''', 他の引数の並び ''' ) :


#処理内容

のように記述しますが、


このメソッドの宣言のうち、

self というのは、

どのような理由で記述しなければならないのでしょうか?



`self` は、Python のクラスにおける

 **インスタンスメソッド** を定義する際に、

 **そのメソッドがどのインスタンスに対して

 操作を行うかを指定するための特別な引数** です。

 

 以下にその理由を詳しく説明します。


---


### 1. **インスタンスとメソッドの関連付け**


インスタンスメソッドは、

クラスの各インスタンスに固有のデータ(属性)を操作したり

参照したりするために作られています。


- **`self` は、呼び出し元のインスタンスを参照します。**


- メソッドの中で、


インスタンスの属性や他のメソッドにアクセスする際、

`self` を使って明示的にアクセスする必要があります。


```python


class Example:

    def set_value(self, value):

# self を使ってインスタンスの属性を操作する

        self.value = value  


    def get_value(self):

# self を使ってインスタンスの属性を参照する

        return self.value  


obj = Example()

obj.set_value(10)  # obj が self に渡される

print(obj.get_value())  # 10

```


---


### 2. **Python のメソッドは明示的にインスタンスを受け取る**


Python の設計哲学として、インスタンスメソッドは 


**暗黙的にインスタンスを渡すのではなく、

明示的に受け取る** 仕組みになっています。


- メソッドを呼び出すと、

Python は自動的に呼び出し元のインスタンスを

最初の引数に渡します。


- `self` の名前は慣例ですが、

他の名前でも動作します

(ただし、可読性のため `self` を使うのが一般的です)。


```python


class Example:


# self 以外の名前でも動作する

    def show_instance(custom_name):  

        print(f"Instance: {custom_name}")




obj = Example()


# 実際には Example.show_instance(obj) として呼び出される

obj.show_instance() 

 

```


---


### 3. **静的メソッドやクラスメソッドとの違い**


- **インスタンスメソッド**: 


`self` を最初の引数として受け取り、

インスタンスに関連するデータや動作を扱う。


- **クラスメソッド**: 


`cls` を最初の引数として受け取り、

クラス全体に関連するデータや動作を扱う。


- **静的メソッド**: 


`self` や `cls` を受け取らず、

インスタンスやクラスに依存しない動作を行う。


```python


class Example:


    def instance_method(self):

        return "This is an instance method."


    @classmethod

    def class_method(cls):

        return "This is a class method."


    @staticmethod

    def static_method():

        return "This is a static method."


obj = Example()


# self を介して呼び出し元のインスタンスにアクセス

print(obj.instance_method())  

# cls を介してクラス全体にアクセス

print(Example.class_method())  

# self や cls に依存しない

print(Example.static_method())  

```


---


### 4. **`self` を使わないとどうなるか**


もし `self` を指定しない場合、

Python はそのメソッドを通常の関数として扱います。


結果として、

インスタンスに紐付けて呼び出すことができなくなります。


```python


class Example:


# self がないのでインスタンスメソッドではない

    def invalid_method():  

        print("This won't work properly.")


obj = Example()


# TypeError: invalid_method() takes 

# 0 positional argument

# but 1 was given

# obj.invalid_method()



```


---


### まとめ


- `self` は、


インスタンスメソッドがどのインスタンスに対して動作するかを

指定するために必要です。



- Python の設計上、


インスタンスは明示的に渡されるため、

`self` を引数として受け取る必要があります。



- `self` を使わないと、


インスタンスに紐付いたデータ(属性)や動作(メソッド)に

アクセスできなくなります。


コメント