ホームページ  >  記事  >  バックエンド開発  >  __new__ と __init__、Python2 の新しいスタイルのクラスとクラシック クラス

__new__ と __init__、Python2 の新しいスタイルのクラスとクラシック クラス

高洛峰
高洛峰オリジナル
2016-10-18 09:35:181104ブラウズ

python2.x では、オブジェクトを継承するクラスを新しいスタイルのクラス (クラス A(object) など) と呼び、オブジェクトを継承しないクラスをクラシック クラス (クラス A() など) と呼びます

クラシック クラスの違いは次の点です:

1. 新しいスタイルのクラス オブジェクトは、__class__ 属性を通じて独自の型を直接取得できます: type

2. 継承検索の順序が変更されました。クラシック クラスが複数の継承を持つ場合、属性検索の順序は次のとおりです。まず、継承ツリーの左側に深く入り、次に戻って右側の検索を開始します (つまり、深さ優先検索)。最初に水平方向に検索します。 、上に移動します

例:

クラシッククラス: 検索順序は(D,B,A,C)です

>>> class A: attr = 1
...
>>> class B(A): pass
...
>>> class C(A): attr = 2
...
>>> class D(B,C): pass
...
>>> x = D()
>>> x.attr
1

新しいスタイルのクラス継承検索プログラムは幅優先です

New-スタイルクラス: 検索順序は(D,B,C,A)です

>>> class A(object): attr = 1
...
>>> class B(A): pass
...
>>> class C(A): attr = 2
...
>>> class D(B,C): pass
...
>>> x = D()
>>> x.attr
2

3. 新しいスタイルクラスの追加 __slots__ 組み込み属性により、インスタンス属性の型を __slots__ で指定された範囲にロックできます。

4. 新しいスタイルのクラスには __getattribute__ メソッドが追加されます

5. 新しいスタイルのクラスには組み込みの __new__ メソッドがありますが、クラシック クラスには __new__ メソッドはなく、__init__ メソッドのみがあります

注: Python 2.x のデフォルトはクラシック クラスですが、Python 3 ではオブジェクトを明示的に継承するものだけが新しいスタイルのクラスです。定義方法は、クラシック クラスを作成し、python2 の dir 関数を使用して確認することです。__new__ メソッドはありません。 2. __new__ メソッドは、最初に __new__ メソッドを呼び出します。 __new__ メソッドは、現在インスタンス化されているクラスを最初のパラメーターとして受け取ります (このパラメーターの型は、C と Python 間の対話型プログラミングで重要な役割を果たします)。興味がある場合は、関連情報を検索してください)。戻り値は、この作成によって生成されたインスタンスです。これは、よく知られている __init__ メソッドの最初のパラメーター self です。次に、このインスタンスはどうなるのかという疑問が生じます。

__new__ メソッドを持つものはオブジェクト クラスの子孫であることに注意してください。そのため、__new__ メソッドを自分でオーバーライドしたい場合は (オーバーライドしない場合は、オブジェクトの作成時に親クラスの __new__ メソッドを使用することに注意してください)インスタンス)、親クラスが存在しない場合は、トレースバックを続行します) このインスタンスは、オブジェクトの __new__ メソッド クラスを呼び出すことで取得できます (これは、実際には基本的に Python のデフォルトのメカニズムと同じです)。たとえば、次のようになります。

上記のコードを実行すると、次の出力が得られます:

new

init

したがって、次の結論を得ることができます:

インスタンス作成プロセスでは、__new__ メソッドが __init__ メソッドの前に呼び出されます。その最初のパラメータの型は type です

他に特別な処理が必要ない場合は、オブジェクトの __new__ メソッドを使用して、作成されたインスタンス (つまり self) を取得できます

したがって、実際に __new__ を使用できることがわかります。そのクラスまたはその親クラスまたは祖先が __new__ メソッドを持っている限り、他のクラスのメソッドを取得します。このような関係では、__init__ は生成用の原材料 self を提供します (ただし、この原材料のソースが保証されるわけではありません)。上記と同様に、このインスタンスを取得するために別の無関係なクラスの __new__ メソッド クラスを使用します)、および __init__ __new__ で指定された要素を使用してこのオブジェクトを完成させます (ただし、これらの要素が本物であるかどうかはわかりません)

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