Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【Python3.x】__class__::__new__()メソッドの使い方

__new__メソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

__new__メソッドは、Pythonにおいてクラスの新しいインスタンスを生成する際に、最も早く実行されるメソッドです。このメソッドは、クラスのオブジェクトが実際にメモリ上に作られる前段階で呼び出され、インスタンスそのものを構築する役割を担っています。具体的には、新しいオブジェクトのメモリ領域を確保し、そのオブジェクトを初期化する前の「生の」インスタンスを生成して返します。

一般的にインスタンスの初期化を担当する__init__メソッドと混同されやすいですが、両者には明確な違いがあります。__new__が「インスタンスの生成」を行うのに対し、__init__は「生成されたインスタンスの初期化」を行います。もし__new__メソッドが新しいインスタンスを返さなかった場合、__init__メソッドは呼び出されません。

__new__メソッドはクラスメソッドとして定義され、第一引数には常にそのクラス自身(慣習的にclsと名付けられます)を受け取ります。そして、インスタンス生成の最終的な結果として、新しいオブジェクトを返さなければなりません。通常、このメソッドをオーバーライドする際には、super().__new__(cls, *args, **kwargs)のように親クラスの__new__メソッドを呼び出し、インスタンスの生成を委譲します。

このメソッドを直接扱うのは、主にイミュータブル(不変)なオブジェクトのサブクラスを作成する際や、特定の条件に基づいてインスタンスの生成を制御したい場合(例えば、シングルトンパターンの実装や、既存のインスタンスを返したい場合など)に限られます。通常のクラスの初期化では__init__メソッドを使用することが一般的であるため、__new__メソッドはPythonのオブジェクト生成の根幹を理解する上で重要な概念ですが、頻繁に利用する機会は少ないでしょう。

構文(syntax)

1class MyClass:
2    def __new__(cls, *args, **kwargs):
3        return super().__new__(cls)

引数(parameters)

cls: type, *args, **kwargs

Python:

  • cls: type: 新しいインスタンスを作成するクラス自身 -*args: tuple: 位置引数 -**kwargs: dict: キーワード引数

戻り値(return)

object

新しいインスタンスを生成して返します。

関連コンテンツ

関連プログラミング言語