Python の 3 つのメソッド __init__、__new__、__call__ の簡単な紹介
この記事では、主に Python の __init__、__new__、__call__ メソッドに関する関連情報をサンプル コードを通じて詳細に紹介します。この記事は、必要なすべての人にとって参照と学習の価値があります。 . 以下のエディターで見てみましょう。
前書き
この記事では主に Python の __init__、__new__、__call__ メソッドに関連する内容を紹介し、参考と学習のために共有します。以下で説明することはあまりありません。詳細 はじめに:
すべてのものには、作成、使用、消滅までのプロセスがあります。プログラミング言語のオブジェクト指向プログラミング モデルでは、オブジェクトも同様の運命をたどります。さまざまな段階がさまざまな段階で構成されます。メソッド (ロール) が実行を担当します。
クラスを定義する場合、最も一般的に使用されるメソッドは __init__ メソッドですが、__new__ と __call__ はそれほど頻繁には使用されません。この記事は、これら 3 つのメソッドの正しい使用法と適用シナリオを説明することを目的としています。
古いスタイルのクラスは Python2 の概念であり、古いスタイルのクラスを使用する人はもうほとんどいないため、この記事では Python の新しいスタイルのクラスと古いスタイルのクラスについてはあまり説明しません。クラスはオブジェクトを明示的に継承する必要があります。Python3 では、新しいスタイルのクラスのみがデフォルトでオブジェクトを継承するため、明示的に指定する必要はありません。この記事のコードはすべて Python3 に基づいています。
__init__ メソッド
__init__ メソッドは、システムがこのメソッドを実行する前に、実際にはすでに存在しています。それ以外の場合、他に何が初期化されるでしょうか。まず例を見てみましょう:
# class A(object): python2 必须显示地继承object class A: def __init__(self): print("__init__ ") super(A, self).__init__() def __new__(cls): print("__new__ ") return super(A, cls).__new__(cls) def __call__(self): # 可以定义任意参数 print('__call__ ') A()
Output
__new__ __init__
出力結果から、最初に __new__ メソッドが呼び出され、インスタンス オブジェクトを返し、次に __init__ が呼び出されます。 __call__ メソッドはまだ呼び出されていません。最初に最初の 2 つのメソッドについて説明します。
def __init__(self): print("__init__ ") print(self) super(A, self).__init__() def __new__(cls): print("__new__ ") self = super(A, cls).__new__(cls) print(self) return self
出力結果から、__new__ メソッドを呼び出します。戻り値はクラスのインスタンス オブジェクトです。このインスタンス オブジェクトは、インスタンス オブジェクトが正しく初期化されるように、__init__ メソッドで定義された self パラメーターに渡されます。
__new__ メソッドが値を返さない (または None を返す) 場合、__init__ は呼び出されません。これは、インスタンス オブジェクトが作成されておらず、init を呼び出すことは無意味であるためです。また、Python では次のように規定されています。 、__init__ は None 値のみを返すことができ、それ以外の場合はエラーが報告されます。これは誰でも試すことができます。
__new__ <__main__.A object at 0x1007a95f8> __init__ <__main__.A object at 0x1007a95f8>
さらに、self を除く __init__ メソッドで定義されたパラメータは、__new__ のパラメータと同じになります。メソッド cls パラメータ以外のパラメータは、一貫性があるか同等である必要があります。
def __init__(self, a, b): self.a = a self.b = b super(A, self).__init__()
__new__ メソッド
一般的に、その方法を正確に知っていない限り、このメソッドはオブジェクトを作成するためのコンストラクターとして使用されます。はい、ファクトリーです。インスタンスオブジェクトの生成専用の関数。有名なデザイン パターンの 1 つであるシングルトン パターンは、この方法で実装できます。フレームワーク レベルのコードを自分で作成するときに使用することもできます。また、マイクロ Web フレームワーク Bootle などのオープン ソース コードからそのアプリケーション シナリオを見つけることもできます。
class B: def __init__(self, *args, **kwargs): print("init", args, kwargs) def __new__(cls, *args, **kwargs): print("new", args, kwargs) return super().__new__(cls) B(1, 2, 3) # 输出 new (1, 2, 3) {} init (1, 2, 3) {}
このコードは https://github.com/bottlepy/bottle/blob/release-0.6/bottle.py からのものです
これは、インスタンスの __new__ メソッドを通じてシングルトン モードを実装する方法です。オブジェクトが存在する場合は、インスタンスを直接返します。まだ存在しない場合は、最初にインスタンスを作成してから返します。もちろん、Python の禅では、シングルトン パターンを実装する方法は複数あります:
__call__ メソッド
__call__ メソッドについては、最初に概念について言及する必要があります。それは、呼び出し可能なオブジェクト (呼び出し可能オブジェクト)、通常のカスタム関数、組み込み関数、およびクラスです。は呼び出し可能なオブジェクトですが、括弧 () のペアに適用できるオブジェクトはすべて呼び出し可能なオブジェクトと呼ぶことができます。オブジェクトが呼び出し可能なオブジェクトかどうかを判断するには、関数 callable が class_ に実装されている場合に使用できます。 _call__ メソッドを使用すると、インスタンス オブジェクトも呼び出し可能なオブジェクトになります。元の例に戻りましょう。
class BaseController(object): _singleton = None def __new__(cls, *a, **k): if not cls._singleton: cls._singleton = object.__new__(cls, *a, **k) return cls._singleton
a はインスタンス オブジェクトであり、呼び出し可能なオブジェクトでもあるため、関数のように呼び出すことができます。試してください:
a() # __call__
很神奇不是,实例对象也可以像函数一样作为可调用对象来用,那么,这个特点在什么场景用得上呢?这个要结合类的特性来说,类可以记录数据(属性),而函数不行(闭包某种意义上也可行),利用这种特性可以实现基于类的装饰器,在类里面记录状态,比如,下面这个例子用于记录函数被调用的次数:
class Counter: def __init__(self, func): self.func = func self.count = 0 def __call__(self, *args, **kwargs): self.count += 1 return self.func(*args, **kwargs) @Counter def foo(): pass for i in range(10): foo() print(foo.count) # 10
在 Bottle 中也有 call 方法 的使用案例,另外,stackoverflow 也有一些关于 call 的实践例子,推荐看看,如果你的项目中,需要更加抽象化、框架代码,那么这些高级特性往往能发挥出它作用。
总结
以上がPython の 3 つのメソッド __init__、__new__、__call__ の簡単な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

PythonコードをSublimeテキストで実行するには、最初にPythonプラグインをインストールし、次に.pyファイルを作成してコードを書き込み、Ctrl Bを押してコードを実行する必要があります。コードを実行すると、出力がコンソールに表示されます。

Visual Studioコード(VSCODE)でコードを作成するのはシンプルで使いやすいです。 VSCODEをインストールし、プロジェクトの作成、言語の選択、ファイルの作成、コードの書き込み、保存して実行します。 VSCODEの利点には、クロスプラットフォーム、フリーおよびオープンソース、強力な機能、リッチエクステンション、軽量で高速が含まれます。

VSコードはPythonの書き込みに使用でき、Pythonアプリケーションを開発するための理想的なツールになる多くの機能を提供できます。ユーザーは以下を可能にします。Python拡張機能をインストールして、コードの完了、構文の強調表示、デバッグなどの関数を取得できます。デバッガーを使用して、コードを段階的に追跡し、エラーを見つけて修正します。バージョンコントロールのためにGitを統合します。コードフォーマットツールを使用して、コードの一貫性を維持します。糸くずツールを使用して、事前に潜在的な問題を発見します。

メモ帳でPythonコードを実行するには、Python実行可能ファイルとNPPEXECプラグインをインストールする必要があります。 Pythonをインストールしてパスを追加した後、nppexecプラグインでコマンド「python」とパラメーター "{current_directory} {file_name}"を構成して、メモ帳のショートカットキー「F6」を介してPythonコードを実行します。
