ホームページ バックエンド開発 Python チュートリアル Pythonの__init__と__new__の違いを詳しく解説

Pythonの__init__と__new__の違いを詳しく解説

Jun 16, 2016 am 08:43 AM
python

__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

ログイン後にコピー

しかし、実行してみると、結果はまったく私たちが考えていたものではなく、-3 のままであることがわかります。これは、int のような不変オブジェクトの場合、その __new__ メソッドをオーバーロードすることによってのみカスタマイズできるためです。

これは変更されたコードです:

class PositiveInteger(int):
  def __new__(cls, value):
    return super(PositiveInteger, cls).__new__(cls, abs(value))

i = PositiveInteger(-3)
print i

ログイン後にコピー

__new__ メソッドをオーバーロードすることで、必要な機能を実現します。

もう 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

本当です

obj1 と obj2 が同じインスタンスであることがわかります。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

C言語合計の機能は何ですか? C言語合計の機能は何ですか? Apr 03, 2025 pm 02:21 PM

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

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

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

独特の目標は関連していますか? 独特の目標は関連していますか? Apr 03, 2025 pm 10:30 PM

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

H5ページの生産には継続的なメンテナンスが必要ですか? H5ページの生産には継続的なメンテナンスが必要ですか? Apr 05, 2025 pm 11:27 PM

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

Cで理解する方法!x? Cで理解する方法!x? Apr 03, 2025 pm 02:33 PM

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

c言語でsumとはどういう意味ですか? c言語でsumとはどういう意味ですか? Apr 03, 2025 pm 02:36 PM

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

58.com作業ページでリアルタイムアプリケーションと視聴者のデータを取得する方法は? 58.com作業ページでリアルタイムアプリケーションと視聴者のデータを取得する方法は? Apr 05, 2025 am 08:06 AM

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

PSが荷重を見せ続ける理由は何ですか? PSが荷重を見せ続ける理由は何ですか? Apr 06, 2025 pm 06:39 PM

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

See all articles