Pythonの__init__と__new__の違いを詳しく解説
__init__ メソッドとは何ですか?
Python でオブジェクト指向のコードを作成したことがある学生は、__init__ メソッドに精通しているかもしれません。通常、__init__ メソッドはクラス インスタンスを初期化するときに使用されます。例:
# -*- coding: utf-8 -*- class Person(object): """Silly Person""" def __init__(self, name, age): self.name = name self.age = age def __str__(self): return '<Person: %s(%s)>' % (self.name, self.age) if __name__ == '__main__': piglei = Person('piglei', 24) print piglei
これは __init__ の最も一般的な使用法です。ただし、実際には __init__ はクラスをインスタンス化するときに呼び出される最初のメソッドではありません。 Persion(name, age) のような式を使用してクラスをインスタンス化する場合、最初に呼び出されるメソッドは実際には __new__ メソッドです。
__new__ メソッドとは何ですか?
__new__ メソッドは __init__ と同じパラメータを受け入れますが、__init__ はクラス インスタンスが作成された後に呼び出され、__new__ メソッドはこのクラス インスタンスを作成するメソッドです。
# -*- coding: utf-8 -*- class Person(object): """Silly Person""" def __new__(cls, name, age): print '__new__ called.' return super(Person, cls).__new__(cls, name, age) def __init__(self, name, age): print '__init__ called.' self.name = name self.age = age def __str__(self): return '<Person: %s(%s)>' % (self.name, self.age) if __name__ == '__main__': piglei = Person('piglei', 24) print piglei
実行結果:
piglei@macbook-pro:blog$ python new_and_init.py __new__ called. __init__ called. <Person: piglei(24)>
このコードを実行すると、__new__ メソッドの呼び出しが __init__ の前に発生することがわかります。実際、クラスをインスタンス化するときの具体的な実行ロジックは次のとおりです:
1.p = 人物(名前、年齢)
2. まず、name パラメータと age パラメータを使用して Person クラスの __new__ メソッドを実行します。この __new__ メソッドは、通常は super(Persion, cls).__new__(cls) などのインスタンスを返します。 ..) この方法)
3. 次に、このインスタンスを使用して、クラスの __init__ メソッドを呼び出します。前の手順で __new__ によって生成されたインスタンスも、__init__ の self
です。したがって、__init__ と __new__ の主な違いは次のとおりです。
1.__init__ は通常、新しいインスタンスを初期化し、クラス インスタンスの作成後に発生するいくつかの属性の追加や追加の操作の実行などの初期化プロセスを制御するために使用されます。これはインスタンスレベルのメソッドです。
2.__new__ は通常、新しいインスタンスを生成するプロセスを制御するために使用されます。これはクラスレベルのメソッドです。
そうは言っても、__new__ の最も一般的な使用法は何ですか?
__new__ の役割
Python の公式ドキュメントによると、__new__ メソッドは主に、一部の不変クラス (int、str、tuple など) を継承するときに、これらのクラスのインスタンス化プロセスをカスタマイズする方法を提供するために使用されます。カスタム メタクラスの実装もあります。
まず、最初の関数を見てみましょう。具体的には、例として int を使用します。
int を統合することで常に正の整数型が必要な場合は、次のようなコードを書くことができます。
class PositiveInteger(int): def __init__(self, value): super(PositiveInteger, self).__init__(self, abs(value)) i = PositiveInteger(-3) print i
これは変更されたコードです:
class PositiveInteger(int): def __new__(cls, value): return super(PositiveInteger, cls).__new__(cls, abs(value)) i = PositiveInteger(-3) print i
もう 1 つの関数はカスタム メタクラスに関するものです。実は、私が初めて __new__ に触れたのは、メタクラスをカスタマイズする必要があったからでしたが、スペースの都合上、Python におけるメタクラスと __new__ の関係については次回にお話します。
__new__ を使用してシングルトンを実装します
実際、__new__ メソッドを理解すると、このメソッドを使用して、デザイン パターンにシングルトン パターンを実装するなど、他の興味深いことを行うこともできます。クラスの各インスタンス化後に生成されるプロセスは __new__ を通じて制御されるため、__new__ メソッドをオーバーロードすることでシングルトン モードを簡単に実装できます。
class Singleton(object): def __new__(cls): # 关键在于这,每一次实例化的时候,我们都只会返回这同一个instance对象 if not hasattr(cls, 'instance'): cls.instance = super(Singleton, cls).__new__(cls) return cls.instance obj1 = Singleton() obj2 = Singleton() obj1.attr1 = 'value1' print obj1.attr1, obj2.attr1 print obj1 is obj2
値1 値1
本当です

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

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

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

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

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

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

ホットトピック









C言語に組み込みの合計機能はないため、自分で書く必要があります。合計は、配列を通過して要素を蓄積することで達成できます。ループバージョン:合計は、ループとアレイの長さを使用して計算されます。ポインターバージョン:ポインターを使用してアレイ要素を指し示し、効率的な合計が自己概要ポインターを通じて達成されます。アレイバージョンを動的に割り当てます:[アレイ]を動的に割り当ててメモリを自分で管理し、メモリの漏れを防ぐために割り当てられたメモリが解放されます。

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

明確で明確なものは区別に関連していますが、それらは異なる方法で使用されます。明確な(形容詞)は、物事自体の独自性を説明し、物事の違いを強調するために使用されます。明確な(動詞)は、区別の動作または能力を表し、差別プロセスを説明するために使用されます。プログラミングでは、個別は、重複排除操作などのコレクション内の要素の独自性を表すためによく使用されます。明確なは、奇数や偶数の偶数を区別するなど、アルゴリズムまたは関数の設計に反映されます。最適化する場合、異なる操作は適切なアルゴリズムとデータ構造を選択する必要がありますが、異なる操作は、論理効率の区別を最適化し、明確で読み取り可能なコードの書き込みに注意を払う必要があります。

H5ページは、コードの脆弱性、ブラウザー互換性、パフォーマンスの最適化、セキュリティの更新、ユーザーエクスペリエンスの改善などの要因のため、継続的に維持する必要があります。効果的なメンテナンス方法には、完全なテストシステムの確立、バージョン制御ツールの使用、定期的にページのパフォーマンスの監視、ユーザーフィードバックの収集、メンテナンス計画の策定が含まれます。

!X理解!Xは、C言語の論理的な非操作者です。 Xの値をブーリングします。つまり、虚偽の真の変化、trueへの誤った変更です。ただし、Cの真実と虚偽はブール型ではなく数値で表されていることに注意してください。非ゼロは真であると見なされ、0のみが偽と見なされます。したがって、!xは正の数と同じ負の数を扱い、真実と見なされます。

Cには組み込みの合計関数はありませんが、次のように実装できます。ループを使用して要素を1つずつ蓄積します。ポインターを使用して、要素に1つずつアクセスして蓄積します。大量のデータ量については、並列計算を検討してください。

クロール中に58.com作業ページの動的データを取得するにはどうすればよいですか? Crawlerツールを使用して58.comの作業ページをrawったら、これに遭遇する可能性があります...

PSの「読み込み」の問題は、リソースアクセスまたは処理の問題によって引き起こされます。ハードディスクの読み取り速度は遅いか悪いです。CrystaldiskInfoを使用して、ハードディスクの健康を確認し、問題のあるハードディスクを置き換えます。不十分なメモリ:高解像度の画像と複雑な層処理に対するPSのニーズを満たすためのメモリをアップグレードします。グラフィックカードドライバーは時代遅れまたは破損しています:ドライバーを更新して、PSとグラフィックスカードの間の通信を最適化します。ファイルパスが長すぎるか、ファイル名に特殊文字があります。短いパスを使用して特殊文字を避けます。 PS独自の問題:PSインストーラーを再インストールまたは修理します。
