さて、今日も引き続き Python でクラスを分析します。
以前クラスを定義したときはコンストラクターを使用しましたが、Python で記述するコンストラクターは非常に特殊です。特別な関数 __init__ ですが、実際には、クラス内にはコンストラクター以外にも __XXX__ 形式の関数が多数あり、__xx__ 属性もいくつかあります。 1 つずつ説明しましょう:
Python のすべてのクラスのコンストラクターは __init__ であり、これはニーズに基づいています。コンストラクターは、パラメーター化されたコンストラクターとパラメーターなしのコンストラクターに分類されます。現在定義されているコンストラクターがない場合、システムはパラメーターのない空のコンストラクターを自動的に生成します。例:
#継承関係のあるクラスでは、親クラスが明示的に定義されている限り、サブクラスは親クラスのコンストラクターを呼び出します。親クラスのオブジェクトの作成は、サブクラスが親クラスのプロパティを継承していない場合でも自動的に実行されます。例:
#サブクラスが親クラスから属性を継承して取得したい場合は、親クラスのコンストラクターを明示的に呼び出して属性を取得する必要があります。そうでない場合は、親クラスのメソッドのみを取得できます。例:
ここでは、関数のオーバーロードという新しい概念を導入する必要があります。クラス内に、同じ名前で異なる関数パラメーター (異なる数値、型、順序) を持つ複数の関数がある場合、これらの関数をオーバーロード関数と呼び、関数の戻り値はオーバーロードの基礎として使用されません。 Java と C にも同様の概念があります。ただし、Python は動的プログラミング言語であり、そのデータにはデータ型がありません。したがって、クラス内で関数をオーバーロードすることはできません。したがって、クラス内に同じ名前の複数のメソッドを持つことはできません。そのため、コンストラクター メソッドはそれを書くか、1つしか書けません。これを記述しない場合、システムは空のパラメーターなしのコンストラクターを自動的に生成します。これを記述した場合は、このコンストラクターのみを呼び出すことができます。さらに、デコレータについて学習していたとき、クラス内に同じ名前のメソッドをいくつか書いていたようです。たとえば、次のようになります。同じ名前はオーバーロードされた関係です? いいえ、これらは完全なメソッドではないため、@property、@name.setter、および @name.deleter の制限を満たしている必要があるため、これは関数のオーバーロードではありません。
これを次のように呼び出します。
は ## として実行されます。
2. オブジェクトの参照には新しい値が割り当てられます
3. オブジェクトは現在のスコープを終了します (最も一般的なのは関数スコープを終了することです)
Python では、 pass sys.getrefcount (オブジェクト名) を実行して、オブジェクトの現在の参照カウンターを取得します。システムによる一時的な参照があるため、ここでの参照カウントは最初は必ずしも 1 ではないことに注意してください。オブジェクトを指す参照カウンタが 0 (最初の初期値) になった場合にのみ、オブジェクトが実際に破棄され、オブジェクトのデストラクタが実行されます。例:
出力は
上記の最初の sys 呼び出しであることに注意してください。 .getrefcount(ad) の戻り値が 4 の場合は、現在のシステムが他の一時的な用途に使用されていることを意味し、4 に達する限り初期状態に戻ります。最終的に delad が発生すると、一時的なシステム参照も解放されます。現在の動作環境はwin pycharmです。もう一度コードを変更してみましょう:
出力は
からわかるように、上記の出力を見ると、システムは基本的なデータ型に対して他の操作を行っているようで、初期の参照カウントが予想よりも大きくなっています。参照データ型のデータはまさに私たちが期待していたものです。
オブジェクトが最終的に解放されたとき (参照カウントが 0 になったとき) のみ、__del__ デストラクター メソッドが実行されます。
最初にコードを見てみましょう:
出力は
オブジェクトを出力すると、オブジェクトのメモリ アドレスが取得されます。基本データ型を出力するように参照データ型を出力できますか? たとえば、上記のクラス Student は His インスタンスを出力する必要があります。変数。
今説明した __str__ メソッドは、この関数を完了するためのものです。__str__ メソッドには戻り値があります。この戻り値は print を実行したときの出力値なので、__str__ を使用できます。メソッド内で出力内容をフォーマットします。 。例:
出力は
上記の出力からわかるように、フォーマットされた参照データ型のデータを出力する場合、このクラスの __str__ メソッドをオーバーライドする必要があります。このメソッドでは、現在のコンテンツの出力内容を設定できます。この __str__ メソッドはオブジェクト クラスのメソッドです。Python のすべてのクラスは直接的または間接的にオブジェクトから派生するため、すべての参照データ型には __str__ メソッドがあります。このメソッドをオーバーライドして親クラスのメソッドをオーバーライドするだけです。それ以外の場合、システムはデフォルトでオブジェクトの __str__ メソッドを呼び出します。
#__dict__自分のクラスにどのような組み込みメンバー (プロパティとメソッド) があるかをどうやって知ることができるのかと言う人もいるかもしれません? たとえば、上記の __str_ についてはわかりません。メソッド、どうやって呼び出すのですか? 確かに、Python クラスには、クラスのすべての組み込みコンテンツを出力できる属性があります。それは__dict__です。この __dict__ はメソッドではなく属性であることに注意してください。呼び出すときに () を追加しないでください。このクラスの親クラスにどのような組み込みメンバーがあるかを知りたい場合は、親クラスの __dict__ 属性を出力するだけです。たとえば、次のように Student クラスの親クラス オブジェクトの組み込みメンバーを見てみましょう。
Ojbect.__dict__ の出力少し長いので、自分で印刷して見てください。その中に __str__ の記述があるはずです。
さて、今日は __init__ コンストラクター、__del__ デストラクター、__str__ 組み込み関数、__dict__ 属性などについて触れました。明日は引き続き他の組み込みメンバーをオブジェクト指向で分析します。
以上がPython オブジェクト指向の一般的な組み込みメンバーの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。