```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` を使うのが一般的な慣習です。
コメント
コメントを投稿