ホームページ  >  記事  >  バックエンド開発  >  Python オブジェクト指向の一般的な組み込みメンバーの紹介

Python オブジェクト指向の一般的な組み込みメンバーの紹介

WBOY
WBOY転載
2023-04-12 09:10:081787ブラウズ

さて、今日も引き続き Python でクラスを分析します。

[[441842]]

以前クラスを定義したときはコンストラクターを使用しましたが、Python で記述するコンストラクターは非常に特殊です。特別な関数 __init__ ですが、実際には、クラス内にはコンストラクター以外にも __XXX__ 形式の関数が多数あり、__xx__ 属性もいくつかあります。 1 つずつ説明しましょう:

Constructor

Python オブジェクト指向の一般的な組み込みメンバーの紹介

Python のすべてのクラスのコンストラクターは __init__ であり、これはニーズに基づいています。コンストラクターは、パラメーター化されたコンストラクターとパラメーターなしのコンストラクターに分類されます。現在定義されているコンストラクターがない場合、システムはパラメーターのない空のコンストラクターを自動的に生成します。例:

Python オブジェクト指向の一般的な組み込みメンバーの紹介

#継承関係のあるクラスでは、親クラスが明示的に定義されている限り、サブクラスは親クラスのコンストラクターを呼び出します。親クラスのオブジェクトの作成は、サブクラスが親クラスのプロパティを継承していない場合でも自動的に実行されます。例:

Python オブジェクト指向の一般的な組み込みメンバーの紹介

#サブクラスが親クラスから属性を継承して取得したい場合は、親クラスのコンストラクターを明示的に呼び出して属性を取得する必要があります。そうでない場合は、親クラスのメソッドのみを取得できます。例:

Python オブジェクト指向の一般的な組み込みメンバーの紹介

ここでは、関数のオーバーロードという新しい概念を導入する必要があります。クラス内に、同じ名前で異なる関数パラメーター (異なる数値、型、順序) を持つ複数の関数がある場合、これらの関数をオーバーロード関数と呼び、関数の戻り値はオーバーロードの基礎として使用されません。 Java と C にも同様の概念があります。ただし、Python は動的プログラミング言語であり、そのデータにはデータ型がありません。したがって、クラス内で関数をオーバーロードすることはできません。したがって、クラス内に同じ名前の複数のメソッドを持つことはできません。そのため、コンストラクター メソッドはそれを書くか、1つしか書けません。これを記述しない場合、システムは空のパラメーターなしのコンストラクターを自動的に生成します。これを記述した場合は、このコンストラクターのみを呼び出すことができます。さらに、デコレータについて学習していたとき、クラス内に同じ名前のメソッドをいくつか書いていたようです。たとえば、次のようになります。同じ名前はオーバーロードされた関係です? いいえ、これらは完全なメソッドではないため、@property、@name.setter、および @name.deleter の制限を満たしている必要があるため、これは関数のオーバーロードではありません。

デストラクターPython オブジェクト指向の一般的な組み込みメンバーの紹介
コンストラクターは、オブジェクトの作成時に自動的に実行され、その主な役割はオブジェクトを初期化することです。デストラクターは、オブジェクトが破棄される (del が実行またはリサイクルされる) ときに自動的に実行され、その主な役割はオブジェクトをリサイクルすることです。以前にデストラクターを作成したことがない場合、システムは空のデストラクターを自動的に生成します。次にデストラクターを書きます。 Python のデストラクター メソッドは __del__ と呼ばれます。例:

これを次のように呼び出します。

Python オブジェクト指向の一般的な組み込みメンバーの紹介

は ## として実行されます。

Python オブジェクト指向の一般的な組み込みメンバーの紹介
#ここでは、Python のガベージ コレクション メカニズムに焦点を当てたいと思います。

現在、ハードウェアの開発が非常に速く、利用できるリソースが非常に豊富であるため、プログラマはシステムのガベージ コレクション メカニズムに特別な注意を払っていません。4G のサーバー メモリは小さく、ほとんどのそのうちの 8G から始まる場合もありますが、これでは十分ではありません。しかし、一部のハイエンドの仕事や高精度の産業にとって、ガベージ コレクション メカニズムは依然として非常に重要です。そこで、ここでPythonのガベージコレクションの仕組みを整理してみましょう。
Python オブジェクト指向の一般的な組み込みメンバーの紹介Python のガベージ コレクション メカニズムは主に参照カウントに基づいています。システムは各オブジェクトに参照カウンタを割り当て、現在のオブジェクトが使用された回数を記録します。カウントが含まれるため、加算と減算の演算が行われます。システムでは、次の条件が満たされた場合にカウンタが 1 増加することが規定されています:
1. 新しいオブジェクトを作成します

2. オブジェクトを参照します

3. を渡しますオブジェクトを実パラメータとして使用します。

次の条件が満たされた場合、カウンターを 1 つ減らします:

1. オブジェクトに対して del 操作を実行します

2. オブジェクトの参照には新しい値が割り当てられます

3. オブジェクトは現在のスコープを終了します (最も一般的なのは関数スコープを終了することです)

Python では、 pass sys.getrefcount (オブジェクト名) を実行して、オブジェクトの現在の参照カウンターを取得します。システムによる一時的な参照があるため、ここでの参照カウントは最初は必ずしも 1 ではないことに注意してください。オブジェクトを指す参照カウンタが 0 (最初の初期値) になった場合にのみ、オブジェクトが実際に破棄され、オブジェクトのデストラクタが実行されます。例:

Python オブジェクト指向の一般的な組み込みメンバーの紹介

出力は

Python オブジェクト指向の一般的な組み込みメンバーの紹介

上記の最初の sys 呼び出しであることに注意してください。 .getrefcount(ad) の戻り値が 4 の場合は、現在のシステムが他の一時的な用途に使用されていることを意味し、4 に達する限り初期状態に戻ります。最終的に delad が発生すると、一時的なシステム参照も解放されます。現在の動作環境はwin pycharmです。もう一度コードを変更してみましょう:

Python オブジェクト指向の一般的な組み込みメンバーの紹介

出力は

Python オブジェクト指向の一般的な組み込みメンバーの紹介

からわかるように、上記の出力を見ると、システムは基本的なデータ型に対して他の操作を行っているようで、初期の参照カウントが予想よりも大きくなっています。参照データ型のデータはまさに私たちが期待していたものです。

オブジェクトが最終的に解放されたとき (参照カウントが 0 になったとき) のみ、__del__ デストラクター メソッドが実行されます。

#str__method

最初にコードを見てみましょう:

Python オブジェクト指向の一般的な組み込みメンバーの紹介

出力は

Python オブジェクト指向の一般的な組み込みメンバーの紹介 です。

オブジェクトを出力すると、オブジェクトのメモリ アドレスが取得されます。基本データ型を出力するように参照データ型を出力できますか? たとえば、上記のクラス Student は His インスタンスを出力する必要があります。変数。

今説明した __str__ メソッドは、この関数を完了するためのものです。__str__ メソッドには戻り値があります。この戻り値は print を実行したときの出力値なので、__str__ を使用できます。メソッド内で出力内容をフォーマットします。 。例:

Python オブジェクト指向の一般的な組み込みメンバーの紹介

出力は

Python オブジェクト指向の一般的な組み込みメンバーの紹介

上記の出力からわかるように、フォーマットされた参照データ型のデータを出力する場合、このクラスの __str__ メソッドをオーバーライドする必要があります。このメソッドでは、現在のコンテンツの出力内容を設定できます。この __str__ メソッドはオブジェクト クラスのメソッドです。Python のすべてのクラスは直接的または間接的にオブジェクトから派生するため、すべての参照データ型には __str__ メソッドがあります。このメソッドをオーバーライドして親クラスのメソッドをオーバーライドするだけです。それ以外の場合、システムはデフォルトでオブジェクトの __str__ メソッドを呼び出します。

#__dict__

自分のクラスにどのような組み込みメンバー (プロパティとメソッド) があるかをどうやって知ることができるのかと言う人もいるかもしれません? たとえば、上記の __str_ についてはわかりません。メソッド、どうやって呼び出すのですか? 確かに、Python クラスには、クラスのすべての組み込みコンテンツを出力できる属性があります。それは__dict__です。この __dict__ はメソッドではなく属性であることに注意してください。呼び出すときに () を追加しないでください。

Python オブジェクト指向の一般的な組み込みメンバーの紹介
出力は

です。 Python オブジェクト指向の一般的な組み込みメンバーの紹介
なぜ stu1.__dict__ の出力コンテンツが少なく、Student.__dict__ の出力コンテンツが多いのですか? stu1 はオブジェクトだからです。オブジェクトの場合、メソッドがすべてで共有されるため、最も意味のあるのは属性です。オブジェクトの。データはそれ自体に固有であり、実行時に必要なのは、クラス (つまり self) のメソッドを実行するために現在のオブジェクトのアドレスを運ぶことだけです。 Student はクラスであり、クラスは属性とメソッドで構成されているため、Student.__dict__ の出力はメソッドと属性を含めてもう少し多くなります。

このクラスの親クラスにどのような組み込みメンバーがあるかを知りたい場合は、親クラスの __dict__ 属性を出力するだけです。たとえば、次のように Student クラスの親クラス オブジェクトの組み込みメンバーを見てみましょう。

Python オブジェクト指向の一般的な組み込みメンバーの紹介

Ojbect.__dict__ の出力少し長いので、自分で印刷して見てください。その中に __str__ の記述があるはずです。

さて、今日は __init__ コンストラクター、__del__ デストラクター、__str__ 組み込み関数、__dict__ 属性などについて触れました。明日は引き続き他の組み込みメンバーをオブジェクト指向で分析します。

以上がPython オブジェクト指向の一般的な組み込みメンバーの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。