Python入門(16/18)
**セクション16 **オブジェクト指向プログラミング
みなさん、こんにちは。これまでのところ、私たちが作成したpythonコードには基本的な機能があります。それは、プログラムを設計し、必要に応じて関数の周りのデータを処理することです。比較的複雑な問題に直面している場合でも、関数、モジュール、パッケージなどのソリューションは、プログラムアーキテクチャとコードの再利用の問題を解決するのに役立ちます。ただし、このプログラミング方法は依然としてプロセス指向プログラミングと呼ばれます。
簡単に言えば、それは本質的に線形プログラミング方法です。 pythonの独自性は、プロセス指向のプログラミングをサポートするのに十分ですが、それでも人気があり、多くの問題を簡単に処理できます。ただし、他の高レベル言語のオブジェクト指向のプログラミング方法と比較すると、プロセス指向のプログラミング方法には一定の制限が必要です。
それでは、今日は、Pythonオブジェクト指向プログラミングについて説明しましょう。
1、 オブジェクト指向プログラミングの基礎:クラスとインスタンス
クラスとインスタンスは、オブジェクト指向プログラミングの基礎です。クラス(Class)は、新しいタイプ(Type)を作成できます。ここで、オブジェクト(Object)は、クラス(Instance)のインスタンスです。
このより抽象的な概念は、次のように理解できます。例:
2、 クラスフィールド、メソッド、属性
クラスには、フィールド(フィールド)とメソッド(メソッド)を含めることができます。
pythonでは、次のような概念を簡単に理解できます。
**フィールド、**はクラスに属する変数です。
**メソッド、**はクラスに属する関数です。
フィールドに関しては、2つのタイプがあります:
(1)クラスのインスタンス(オブジェクト)に属するフィールドは、インスタンス変数と呼ばれます。
(2)特定のクラス自体に従属するフィールドは、クラス変数と呼ばれます。
**メソッドに関しては、特別なパラメータself **があります
通常の関数との違い:特定のクラスに属することに加えて、特別なパラメーターselfをパラメーターリストの先頭に追加する必要がありますが、このメソッドを呼び出すときにこのパラメーターに値を割り当てる必要はありません。Pythonがそれを提供します。
実際、クラスのメソッドを呼び出すと、Pythonは自動的にselfパラメーターをmyobjectに変換するため、値を割り当てる必要はありません。これは、クラスのメソッドがパラメーターを持つことを計画していない場合でも、それに自己パラメーターを追加する必要があることを意味します。
PS: Pythonのselfは、C ++のこのポインター、およびJavaとC#のこの参照と同等です。
3、 クラスの作成
クラスは、classキーワードを使用して作成できます。
クラスの名前の後に括弧のペアが続くと、クラスのインスタンスが作成されます。
次は、このクラスの本体を表す、インデントされたステートメントのブロックです。
**例16_1:**この例では、passステートメントを使用して空のコードブロックを作成しました。
実行結果は次のようになります。myclassクラスの** __ main __ モジュールにはインスタンス MyClassObject **があり、オブジェクトをメモリに格納するアドレスが表示されます。もちろん、表示されるアドレスは同じであってはなりません。Pythonは、見つかった任意のスペースにオブジェクトを格納するからです。
4、 メソッドの作成
メソッドのクラス定義(メソッド)は、関数を定義するのと同じように、実際には非常に単純です。唯一の違いは、そのメソッドにも追加の自己パラメーターがあることです。
**例16_2 **
ここで、selfの存在を確認できます。say_hi()の呼び出しには元々パラメーターは必要ありませんが、メソッド定義でselfパラメーターを指定する必要があることに注意してください。
5、__ init__メソッド
前後に二重下線が付いているこのメソッドは、pythonに組み込まれている特別なメソッドです。
ここで、__ init__メソッドの特別な意味は何であるかを理解するようになりますか?
**__ init__メソッドは、そのクラスがインスタンス化(インスタンス化)されるとすぐに実行されます。このメソッドは、操作するターゲットオブジェクトを初期化(初期化)できます。 ****
ここでは、initの前後に追加された二重下線に注意する必要があります。
コード分析:
(1)この例では、2つの名前変数を定義していますが、それらは同じではなく、混乱を招くことはありません。 self.nameのドットは、その「name」が「self」オブジェクトの一部であり、他の名前が純粋にローカル変数であることを意味するためです。
(2)MyClassクラスのインスタンスはsay_hi()メソッドを呼び出しますが、明示的に__init __()メソッドを呼び出しませんが、すでに実行されています。これがこの方法を特別なものにしている理由です。
6、 クラス変数とインスタンス変数
フィールドとメソッドはどちらもクラスの属性です。
メソッドがクラスの関数を実装することはすでに知っています。フィールドはどうですか? **このフィールドは、クラスのデータを格納するために使用されます。 ****
データの形式として、フィールドは実際にはクラスとオブジェクトの名前付け(つまり、クラスのインスタンス)にバインドされた通常の変数です。つまり、定義するクラスのフィールドは、これらのクラスとオブジェクトが存在する場合にのみ有効です(「コンテキスト」と呼ばれます)。もう少し単純化してください。フィールドは実際にはクラスの名前名にバインドされた通常の変数であり、これらのクラスが存在する場合にのみ有効です。
クラス変数とインスタンス変数の2種類のフィールド。
クラス変数は共有されています-クラスのすべてのインスタンスからアクセス(使用)できます。このタイプの変数のコピーは1つだけです。オブジェクトがクラス変数を変更すると、その変更は他のすべてのインスタンスに反映されます。
**インスタンス変数(オブジェクト変数)**は、クラスの個々のインスタンス(オブジェクト)によって所有されます。この場合、各オブジェクトには独自の独立したフィールドがあります。つまり、オブジェクトは共有されず、他の異なるインスタンスで同じ名前のフィールドに関連付けられることもありません。
コード分析:
(1)クラス変数xが定義されており、クラスのすべてのインスタンスで有効になります。注: MyClass.xなど、使用する場合は事前クラス名が必要です。
(2)方法1では、同じ名前のローカル変数x = -1も意図的に定義しました。したがって、方法2のxの値には影響しないことに注意してください。
7、 クラスの継承
オブジェクト指向プログラミングの重要な機能(および大きな利点)はコードの再利用(Reuse)であり、再利用の実装方法の1つは継承(Inheritance)です。
**継承の例について話しましょう。設計要件は次のとおりです。**アプリケーションに大学の教師と学生が関与するとします。名前、年齢、住所など、これらの特性のいくつかはそれらによって共有されます。教師の給与、コース、休暇、学生の成績と授業料などの他の機能は、独立して所有されています。
このソリューションでは、情報を処理するための2つの「独立した面倒な」クラスを作成できます。
しかし、もっと良い方法は、SchoolMemberというパブリッククラスを作成してから、Teacher(Teacher)サブクラスとStudent(Student)サブクラスの2つのサブクラスを作成し、SchoolMemberクラスを継承させることです。次に、これらのサブタイプにいくつかの必要な固有の特性を追加します。
親クラス**:** SchoolMember、ベースクラスまたはスーパークラスとも呼ばれます。
**サブクラス:**教師と学生のクラスは、派生クラスまたはサブクラスと呼ばれます。
(1)、最初に学校のクラスを作成します: SchoolMember、つまり:親クラス(基本クラス)
(2)さらに2つのサブカテゴリを作成します: TeacherとStudent。
注意:クラス名の後の括弧で親クラスを宣言します。
(3)サブクラスを呼び出す
# コードの実行、出力:
( 初期化されたSchoolMember:Teacher Zhang)
( 初期化された教師:張教師)
( 初期化されたSchoolMember:Xiao Ming)
( 初期化された学生:シャオミン)
名前:「張さん」年齢:「40」給与:「30000」
名前: "小明"年齢: "25"マーク: "75"
8、 クラスとクラス継承のいくつかの重要な機能
(1)クラスは基本クラスからプロパティ(フィールドとメソッド)を継承します
実際には、サブクラスのメソッド名の前に基本クラスの名前を付けてから、self変数やその他の変数を渡すことで、基本クラスのメソッドを呼び出すことができます。
たとえば、TeacherサブクラスとStudentサブクラスでは、基本クラスのメソッドSchoolMember.tell(self)を直接使用できます。
(2)インスタンスは、すべての読み取り可能なクラス(サブクラスと親クラス)の属性(フィールドとメソッド)を継承します
この場合、SchoolMemberクラスのtellメソッドを使用すると、SchoolMemberのtellメソッドの代わりにサブタイプのtellメソッドが呼び出されることがわかります。これは、Pythonが常に現在のインスタンスのタイプからメソッドを探すためです。見つからない場合は、クラスが属する基本クラスを引き続き検索します。
**(3)サブクラスで__init__メソッドが定義されている場合は、最初に呼び出されます。このときに基本クラスの__init__メソッドを呼び出す必要がある場合は、明示的に呼び出す必要があります。 __init__メソッドがサブクラスで定義されていない限り、クラスの__init__メソッドは自動的に実行されます。 ****
たとえば、TeacherサブクラスとStudentサブクラスで__init__メソッドを定義する場合、Pythonは基本クラスSchoolMemberのコンストラクターを自動的に呼び出さないため、明示的に呼び出す必要があります。逆に、サブクラスで__init__メソッドを定義しない場合、Pythonは自動的に基本クラスのメソッドを呼び出します。
**(4)親クラスの機能を変更すると、子クラスに自動的に反映されます。逆に、サブカテゴリの変更は他のサブカテゴリに影響を与えません。 ****
たとえば、この場合、SchoolMemberクラスを操作するだけで、すべての教師と学生に新しいIDカードフィールドを追加できます。
概要
Pythonは非常にオブジェクト指向です。長期的には、小さなアプリケーションを永遠に実行することはできません。これらの概念を理解することは非常に役立ちます。
プレビュー
次のレッスンでは、入力と出力の処理方法、およびPythonでファイルにアクセスする方法を学習します。これは、Pythonで非常に重要で広く使用されている知識ポイントでもあります。
Recommended Posts