回答編集履歴

2 追記

hayataka2049

hayataka2049 score 30739

2021/05/05 18:32  投稿

そのクラスのインスタンスを返す、ある種の特殊なコンストラクタとして使うのが、実用的な用途の一つだと思います(それがすべてではないと思いますが、一例として書いてみます)。
組み込み型のドキュメントにあるかな、と思って探したら、一番最初に見つかったのはこれでした。
> classmethod int.from_bytes(bytes, byteorder, *, signed=False)
> 与えられたバイト列の整数表現を返します。
>
> ```python
> >>> int.from_bytes(b'\x00\x10', byteorder='big')
> 16
> >>> int.from_bytes(b'\x00\x10', byteorder='little')
> 4096
> >>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=True)
> -1024
> >>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=False)
> 64512
> >>> int.from_bytes([255, 0, 0], byteorder='big')
> 16711680
> ```
>
> [組み込み型 — Python 3.9.4 ドキュメント | int.from_bytes](https://docs.python.org/ja/3/library/stdtypes.html?highlight=dict#int.from_bytes)
こういうのは関数よりはメソッドにしたが使いやすいですし、コンストラクタに直接実装するとコードの見通しが悪くなります。ということでクラスメソッドが適当な感じがします。
---
ということは[質問者さんの参考にしているページ](https://blog.pyq.jp/entry/Python_kaiketsu_190205)にも書いてあるな……とあとから見て思ったので、ちょっと追記。
クラスメソッドはクラス自身を第一引数に取れます。なので、`cls`を使って何らかの処理を行うようなクラスメソッドであれば、サブクラスから呼び出した場合も適切に機能することが期待できる、というのは、関数にはないメリットと言えると思います。
クラスメソッドはクラス自身を第一引数に取れます。なので、`cls`を使って何らかの処理を行うようなクラスメソッドであれば、サブクラスから呼び出した場合も適切に機能することが期待できる、というのは、関数にはないメリットと言えると思います。
```python
class Hoge:
   ほにゃらら
class Fuga:
   @classmethod
   def from_hoge(cls, hogeobj):
       hogeobjを加工したりとか色々する
       return cls(ほにゃらら)
```
という感じの定義があったときに、
```python
class FugaX(Fuga):
   ほにゃらら
class FugaY(Fuga):
   ほにゃらら
class FugaZ(Fuga):
   ほにゃらら
hoge = Hoge()
fx = FugaX.from_hoge(hoge) # fxはFugaXのインスタンスになる
fy = FugaY.from_hoge(hoge) # fyはFugaYのインスタンスになる
fz = FugaZ.from_hoge(hoge) # fzはFugaZのインスタンスになる
```
ということができるという理屈です。
1 追記

hayataka2049

hayataka2049 score 30739

2021/05/05 18:21  投稿

そのクラスのインスタンスを返す、ある種の特殊なコンストラクタとして使うのが、実用的な用途の一つだと思います(それがすべてではないと思いますが、一例として書いてみます)。
組み込み型のドキュメントにあるかな、と思って探したら、一番最初に見つかったのはこれでした。
> classmethod int.from_bytes(bytes, byteorder, *, signed=False)
> 与えられたバイト列の整数表現を返します。
>
> ```python
> >>> int.from_bytes(b'\x00\x10', byteorder='big')
> 16
> >>> int.from_bytes(b'\x00\x10', byteorder='little')
> 4096
> >>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=True)
> -1024
> >>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=False)
> 64512
> >>> int.from_bytes([255, 0, 0], byteorder='big')
> 16711680
> ```
>
> [組み込み型 — Python 3.9.4 ドキュメント | int.from_bytes](https://docs.python.org/ja/3/library/stdtypes.html?highlight=dict#int.from_bytes)
こういうのは関数よりはメソッドにしたが使いやすいですし、コンストラクタに直接実装するとコードの見通しが悪くなります。ということでクラスメソッドが適当な感じがします。
こういうのは関数よりはメソッドにしたが使いやすいですし、コンストラクタに直接実装するとコードの見通しが悪くなります。ということでクラスメソッドが適当な感じがします。
---
ということは[質問者さんの参考にしているページ](https://blog.pyq.jp/entry/Python_kaiketsu_190205)にも書いてあるな……とあとから見て思ったので、ちょっと追記。
クラスメソッドはクラス自身を第一引数に取れます。なので、`cls`を使って何らかの処理を行うようなクラスメソッドであれば、サブクラスから呼び出した場合も適切に機能することが期待できる、というのは、関数にはないメリットと言えると思います。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る