python_class_クラスに_複数のコンストラクタ_initメソッド_02

 


```python


class MyClass:

    def __init__(self, value):

        self.data = value


    @classmethod

    def from_string(cls, text):

        return cls(len(text))


    @classmethod

    def default(cls):

        return cls(0)


# 使い方


# 通常のコンストラクタ

obj1 = MyClass(10) 

           

# 文字列の長さで初期化

obj2 = MyClass.from_string("hello")

  

# デフォルト値で初期化

obj3 = MyClass.default()      


print(obj1.data)  # 10

print(obj2.data)  # 5

print(obj3.data)  # 0


```


上記のようなpythonのコードがあるとき、


clsというのは、


あるクラス内で使われたときには、

そのクラスのことを表すキーワード、あるいは予約語

ということになるのでしょうか?



いいえ、`cls` は Python の予約語ではなく、

単なる **慣習的な引数名** です。


### `cls` の役割:


クラスメソッド (`@classmethod`) の最初の引数は、

そのクラス自体を参照します。この引数名として 

`cls` が **一般的に** 使われますが、


これは **予約語ではなく、ただの変数名** です。


例えば、次のように `cls` ではなく別の名前を使うこともできます。


```python


class MyClass:


    def __init__(self, value):

        self.data = value


    @classmethod

# cls の代わりに ClassReference を使用

    def from_string(ClassReference, text):  

        return ClassReference(len(text))


obj = MyClass.from_string("hello")

print(obj.data)  # 5

```


このように、`cls` はあくまで 

**「クラス自身を受け取る引数」** を示す慣習的な書き方であり、

`self` がインスタンスメソッドでの慣習的な引数名であるのと同じです。


### `cls` と `self` の違い


- `self` → **インスタンスメソッド** の第1引数

(インスタンス自身を参照)


- `cls` → **クラスメソッド** の第1引数(クラス自身を参照)


したがって、Python の文法上 `cls` は特別なキーワードではなく、

他の変数名に変更することも可能ですが、

`cls` を使うのが一般的な慣習です。


コメント