Python-classes-objects
Python-オブジェクト指向
Pythonは、存在して以来オブジェクト指向言語でした。 このため、クラスとオブジェクトの作成と使用は非常に簡単です。 この章は、Pythonのオブジェクト指向プログラミングサポートの使用に関する専門家になるのに役立ちます。
オブジェクト指向(OO)プログラミングの経験がない場合は、入門コースまたは少なくとも何らかのチュートリアルを参照して、基本的な概念を把握してください。
ただし、ここでは、オブジェクト指向プログラミング(OOP)を少し紹介して、スピードを上げます-
OOP用語の概要
- クラス-クラスのオブジェクトを特徴付ける一連の属性を定義するオブジェクトのユーザー定義プロトタイプ。 属性は、データメンバー(クラス変数とインスタンス変数)とメソッドであり、ドット表記でアクセスします。
- クラス変数-クラスのすべてのインスタンスで共有される変数。 クラス変数はクラス内で定義されますが、クラスのメソッドの外部で定義されます。 クラス変数は、インスタンス変数ほど頻繁には使用されません。
- データメンバー-クラスとそのオブジェクトに関連付けられたデータを保持するクラス変数またはインスタンス変数。
- 関数のオーバーロード-特定の関数への複数の動作の割り当て。 実行される操作は、関連するオブジェクトまたは引数のタイプによって異なります。
- インスタンス変数-メソッド内で定義され、クラスの現在のインスタンスにのみ属する変数。
- 継承-クラスの特性を、それから派生した他のクラスに転送します。
- インスタンス-特定のクラスの個々のオブジェクト。 たとえば、クラスCircleに属するオブジェクトobjは、クラスCircleのインスタンスです。
- インスタンス-クラスのインスタンスの作成。
- メソッド-クラス定義で定義されている特別な種類の関数。
- オブジェクト-クラスによって定義されるデータ構造の一意のインスタンス。 オブジェクトは、データメンバー(クラス変数とインスタンス変数)とメソッドの両方で構成されます。
- 演算子のオーバーロード-特定の演算子への複数の関数の割り当て。
クラスを作成する
_class_ステートメントは、新しいクラス定義を作成します。 クラスの名前は、キーワード_class_の直後に次のようにコロンが続きます-
- クラスには、_ClassName .doc_からアクセスできるドキュメント文字列があります。
- _class_suite_は、クラスメンバー、データ属性、および関数を定義するすべてのコンポーネントステートメントで構成されます。
例
以下は、単純なPythonクラスの例です-
- 変数_empCount_は、このクラスのすべてのインスタンス間で値が共有されるクラス変数です。 これは、クラス内またはクラス外から_Employee.empCount_としてアクセスできます。
- 最初のメソッド_ init()_は特別なメソッドで、このクラスの新しいインスタンスを作成するときにPythonが呼び出すクラスコンストラクターまたは初期化メソッドと呼ばれます。
- 各メソッドの最初の引数が_self_であることを除いて、通常の関数のような他のクラスメソッドを宣言します。 Pythonは_self_引数をリストに追加します;メソッドを呼び出すときに含める必要はありません。
インスタンスオブジェクトの作成
クラスのインスタンスを作成するには、クラス名を使用してクラスを呼び出し、その_init_メソッドが受け入れる引数を渡します。
属性へのアクセス
オブジェクトのドット演算子を使用して、オブジェクトの属性にアクセスします。 クラス変数は、次のようにクラス名を使用してアクセスされます-
今、すべての概念をまとめる-
上記のコードが実行されると、次の結果が生成されます-
あなたはいつでもクラスやオブジェクトの属性を追加、削除、変更できます-
通常のステートメントを使用して属性にアクセスする代わりに、次の機能を使用できます-
- * getattr(obj、name [、default])*-オブジェクトの属性にアクセスします。
- * hasattr(obj、name)*-属性が存在するかどうかを確認します。
- * setattr(obj、name、value)*-属性を設定します。 属性が存在しない場合、作成されます。
- * delattr(obj、name)*-属性を削除します。
組み込みクラスの属性
すべてのPythonクラスは組み込みの属性を追跡し続け、他の属性と同様にドット演算子を使用してアクセスできます-
- dict -クラスの名前空間を含む辞書。
- doc -クラスのドキュメント文字列または未定義の場合はなし。
- name -クラス名。
- module -クラスが定義されているモジュール名。 この属性は、対話モードでは「main」です。
- bases -基本クラスリストに出現する順序で、基本クラスを含む空の可能性のあるタプル。
上記のクラスの場合、これらすべての属性にアクセスしてみましょう-
上記のコードが実行されると、次の結果が生成されます-
オブジェクトの破棄(ガベージコレクション)
Pythonは、不要なオブジェクト(組み込み型またはクラスインスタンス)を自動的に削除して、メモリスペースを解放します。 Pythonが使用されなくなったメモリブロックを定期的に回収するプロセスは、ガベージコレクションと呼ばれます。
Pythonのガベージコレクターは、プログラムの実行中に実行され、オブジェクトの参照カウントがゼロに達するとトリガーされます。 オブジェクトの参照カウントは、それを指すエイリアスの数が変わると変わります。
オブジェクトの参照カウントは、新しい名前が割り当てられるか、コンテナ(リスト、タプル、または辞書)に配置されると増加します。 オブジェクトの参照カウントは、_del_で削除されるか、参照が再割り当てされるか、参照が範囲外になると減少します。 オブジェクトの参照カウントがゼロに達すると、Pythonはそれを自動的に収集します。
通常、ガベージコレクターが孤立したインスタンスを破棄し、そのスペースを再利用することに気付かないでしょう。 しかし、クラスは、インスタンスが破棄される直前に呼び出されるデストラクタと呼ばれる特別なメソッド_ del()_を実装できます。 このメソッドは、インスタンスで使用されているメモリ以外のリソースをクリーンアップするために使用される場合があります。
例
このdel()デストラクタは、破棄されようとしているインスタンスのクラス名を出力します-
上記のコードが実行されると、次の結果が生成されます-
注-理想的には、クラスを別のファイルで定義し、_import_ステートメントを使用してメインプログラムファイルにインポートする必要があります。
クラスの継承
最初から始める代わりに、新しいクラス名の後に括弧で親クラスをリストすることにより、既存のクラスから派生させることにより、クラスを作成できます。
子クラスは親クラスの属性を継承し、それらの属性を子クラスで定義されているかのように使用できます。 子クラスは、親からのデータメンバーとメソッドをオーバーライドすることもできます。
構文
派生クラスは、親クラスのように宣言されます。ただし、継承する基本クラスのリストは、クラス名の後に指定されます-
例
上記のコードが実行されると、次の結果が生成されます-
同様に、次のように複数の親クラスからクラスを駆動することができます-
issubclass()またはisinstance()関数を使用して、2つのクラスとインスタンスの関係を確認できます。
- * issubclass(sub、sup)ブール関数は、指定されたサブクラス *sub が実際にスーパークラス sup のサブクラスである場合にtrueを返します。
- * isinstance(obj、Class)*ブール関数は、_obj_がクラス_Class_のインスタンスであるか、クラスのサブクラスのインスタンスである場合にtrueを返します。
メソッドのオーバーライド
親クラスのメソッドはいつでもオーバーライドできます。 親のメソッドをオーバーライドする理由の1つは、サブクラスで特別な機能または異なる機能が必要になる場合があるためです。
例
上記のコードが実行されると、次の結果が生成されます-
ベースのオーバーロード方法
次の表は、独自のクラスでオーバーライドできるいくつかの一般的な機能を示しています-
Sr.No. | Method, Description & Sample Call |
---|---|
1 |
init ( self [,args…] ) コンストラクター(オプションの引数を使用) サンプル呼び出し:obj = className(args) |
2 |
del( self ) デストラクタ、オブジェクトを削除します サンプル呼び出し:del obj |
3 |
repr( self ) 評価可能な文字列表現 サンプル呼び出し:repr(obj) |
4 |
str( self ) 印刷可能な文字列表現 サンプル呼び出し:str(obj) |
5 |
cmp ( self, x ) オブジェクト比較 サンプル呼び出し:cmp(obj、x) |
演算子のオーバーロード
2次元ベクトルを表すVectorクラスを作成したとします。プラス演算子を使用してそれらを追加するとどうなりますか? Pythonが大声で叫ぶでしょう。
ただし、クラスで_add_メソッドを定義してベクトル加算を実行すると、プラス演算子が期待どおりに動作します-
例
上記のコードが実行されると、次の結果が生成されます-
データ隠蔽
オブジェクトの属性は、クラス定義の外部で表示される場合と表示されない場合があります。 二重アンダースコアプレフィックスを使用して属性に名前を付ける必要があり、それらの属性は部外者に直接表示されません。
例
上記のコードが実行されると、次の結果が生成されます-
Pythonは、名前を内部的に変更してクラス名を含めることにより、これらのメンバーを保護します。 _object._className__attrName_などの属性にアクセスできます。 次のように最後の行を置き換える場合、それはあなたのために動作します-
上記のコードが実行されると、次の結果が生成されます-