オブジェクト指向技術の基本概念
-
クラス:同じプロパティとメソッドを持つオブジェクトのコレクションを記述するために使用されます。コレクション内のすべてのオブジェクトに共通のプロパティとメソッドを定義します。オブジェクトはクラスのインスタンスです。簡単に言うと、クラスはテンプレートであり、インスタンスはクラスに基づいて作成されるオブジェクトです。
-
**クラス変数:** クラス変数は、インスタンス化されたオブジェクト全体でパブリックです。クラス変数は、クラス内および関数本体の外で定義されます。クラス変数は通常、インスタンス変数としては使用されません。
-
**インスタンス変数:** メソッド内で定義された変数は、現在のインスタンスのクラスにのみ作用します。
-
**データ メンバー:** クラス変数またはインスタンス変数は、クラスとそのインスタンス オブジェクトに関連するデータを処理するために使用されます。
-
**メソッド: **クラスで定義された関数。
-
**インスタンス化:** クラスのインスタンス、つまりクラスの特定のオブジェクトを作成します。
-
**オブジェクト:** クラスによって定義されたデータ構造のインスタンス。オブジェクトには 2 つのデータ メンバー (クラス変数とインスタンス変数) とメソッドが含まれます。
-
カプセル化: 複数のメソッドまたはプロパティをプライベート クラスに配置すると、このプライベート クラスは他のオブジェクトからアクセスされなくなります。
-
**継承:** 派生クラスは、基本クラスのフィールドとメソッドを継承します。
継承により、派生クラスのオブジェクトを基本クラスのオブジェクトとして扱うことができます。たとえば、次のような設計があります。Dog 型のオブジェクトは Animal クラスから派生しているため、Dog も Animal です。
-
**メソッドの書き換え:** 親クラスから継承したメソッドがサブクラスのニーズを満たすことができない場合は、メソッドを書き換えることができます。このプロセスはメソッド オーバーライドと呼ばれ、メソッドの書き換えとも呼ばれます。
-
ポリモーフィズム: 同じクラスの同じメソッドを呼び出す異なるオブジェクトは、異なる形式を示します。
継承、カプセル化、およびポリモーフィズムは、オブジェクト指向の 3 つの主要な特徴です。クラスはオブジェクト指向の 3 つの大きな特徴を実現できます。
他のプログラミング言語と比較して、Python は新しい構文やセマンティクスをできるだけ追加せずにクラスのメカニズムを追加します。
Python のオブジェクト
-
オブジェクトは Python の最も基本的な概念の 1 つであり、Python ではすべてのものをオブジェクトにすることができます。
Python はすべてのデータをオブジェクトとして処理し、代入ステートメントによってメモリ内にオブジェクトと変数が作成されます。
-
オブジェクトには、タイプ、アイデンティティ、値という 3 つの基本属性があります。
print(type(500)) # 输出:<class 'int'> # 对象的类型 print(id(500)) # 输出:2556827724176 # 对象的身份标识 print(500) # 输出:500 # 对象的值
クラス定義
簡単な説明
Python では任意の変数をオブジェクトと呼ぶことができますが、実際のオブジェクトはクラスの属性とメソッドの特定のインスタンス化であり、クラスを使用することによってのみ真のオブジェクトを作成できます。
Python では、クラスはclassキーワードによって定義され、クラス名の一般的な規則は最初の文字を大文字にすることです。
-
クラスの基本形式を定義します。
class 类名(父类): pass # 此处可添加属性和方法 class 类名: pass # 此处可添加属性和方法
注記:
-
デフォルトでは、Python3 のすべてのクラスはオブジェクト クラスを暗黙的に継承するため、Python3 ではオブジェクト クラスを明示的に継承する必要はありません。
-
Python の内部クラス。Python の内部クラスはクラスだけでなくメソッドでも定義できます。
クラスの属性
クラス属性とインスタンス属性の 2 種類に分かれます。
-
クラス属性: クラスにバインドされた属性。コピーは 1 つだけあり、各インスタンスからアクセスできる共通の属性です。
-
クラス属性は、Java の静的定数と同様に、クラスを通じて直接呼び出すことも、クラスのインスタンス化されたオブジェクトを通じて呼び出すこともできます。
-
注: Python でクラスのインスタンス化オブジェクトを通じてクラス属性の値を変更しても、クラス変数の値は変更されません。
インスタンスを介してクラスの属性を変更すると、実際にはクラス属性と同じ名前のインスタンスのインスタンス属性が作成され、インスタンス属性が変更されるためです。インスタンス属性のアクセス優先順位はクラス属性よりも高いため、インスタンス属性はアクセス中に最初にアクセスされるため、クラス属性への削除アクセスがブロックされます
class Person: name = 'aaa'; person = Person() print(person.name) # 输出:aaa person.name = "bbb" print(person.name) # 输出:bbb print(Person.name) # 输出:aaa del person.name # 可以使用 del 删除与类属性同名的实例属性 print(person.name) # 输出:aaa
-
-
インスタンス属性: 各インスタンスは独自の属性を持ち、互いに独立しています。
インスタンスのプロパティにアクセスします。
- インスタンスメソッド内で「self.プロパティ名」を渡します。
- クラス外ではインスタンスメソッドを呼び出して間接的にアクセス
**プライベート インスタンス プロパティ:** プロパティ名はアンダースコア (
_private_attrs
) で始まり、プロパティがプライベートとして宣言されており、クラス外で使用したり直接アクセスしたりできないことを示します。クラス内のメソッドで使用する方法は次のとおりです。self._private_attrs
クラスメソッド
クラス内では、defキーワードを使用して関数を定義します。クラス内で定義された関数はメソッドとも呼ばれます。
-
クラスメソッド:
Python では、クラス メソッドはデコレーター@classmethodによって装飾されたメソッドであり、クラス メソッドであることを示します。
クラス メソッドの最初のパラメータは cls で、クラス自体を表します。これにより、クラス メソッドがクラス プロパティや他のクラス メソッドにアクセスして変更できるようになります。
クラス メソッドは、クラスを通じて直接呼び出すことも、クラスのインスタンス化されたオブジェクトを通じて呼び出すこともできます (非推奨)
サブクラスの継承: サブクラスは、親クラスのクラス メソッドを継承およびオーバーライドできます。
-
インスタンスメソッド:
一般的な関数定義とは異なり、インスタンス メソッドの最初の仮パラメータは self である必要があります。ここでの self の意味は、インスタンス化されたオブジェクトを指します。
注: self は Python のキーワードではないため、インスタンス メソッドの最初の仮パラメータには実際には別の名前を付けることができますが、業界の慣例では self という名前が付けられています。
インスタンス メソッドを呼び出します。
- インスタンスメソッド内で「self.methodname()」を渡します。
- クラス外では「オブジェクト名.インスタンスメソッド名(selfパラメータを除く)」を渡す
-
静的メソッド:
デコレータ: 静的メソッドは@staticmethodデコレータを使用して定義されます。
パラメータ: 静的メソッドには特別なパラメータはなく、クラス自体やインスタンスへの参照も必要ありません。これらは通常の関数と似ています。
クラスのプロパティおよびメソッドにアクセスできない: 静的メソッドは、クラスまたはインスタンスをパラメータとして渡さないため、クラスのプロパティおよびメソッドに直接アクセスできません。
オブジェクトのインスタンス化は必須ではありません。オブジェクトをインスタンス化せずに、クラス自体から静的メソッドを呼び出すことができます。たとえば、MyClass.my_static_method()
サブクラスによる継承なし: 静的メソッドはクラスまたはインスタンスに関連付けられていないため、サブクラスによって継承されません。
一般的なシナリオ: 静的メソッドは通常、クラスに関連するが、ユーティリティ関数やヘルパー関数などの特定のインスタンスには関連しない操作に使用されます。
-
プライベートメソッド:
2 つのアンダースコア ( ) で始まるメソッドは、
__private_method
そのメソッドがプライベート メソッドとして宣言されており、クラス外から呼び出すことができないことを示します。クラス内の呼び出しメソッドは次のとおりです。
slef.__private_methods
クラスの特別な関数
主に以下のような種類があります。
-
__init__
(初期化関数): オブジェクトを作成するクラスを呼び出す際に自動的に呼び出され、オブジェクトの初期化が完了します。Python の初期化関数はメソッドのオーバーロードをサポートしていません。
Python では、
**map
初期化関数を柔軟なマルチパラメータ転送として定義できます。class TestClassA: def __init__(self, a, b): print("我是python的构造方法"); class TestClassB: #定义灵活的可传递任何数据的构造方法 def __init__(self, **map): print("我是python的构造方法" + map.get("name")); print("我是python的构造方法" + map.get("age"));
拡張機能:
__init__
メソッドの使用法は Java のコンストラクター メソッドに似ていますが、コンストラクター メソッドではありません。Python でインスタンスを作成するメソッドは です。__new__
このメソッドは主に Python でデフォルトで使用され、通常はコンストラクター メソッドである必要はありません再定義した。 -
__del__
(デストラクター): オブジェクトがリサイクルされるときに自動的に呼び出されます。クラスを定義するときにコンストラクターとデストラクターの両方を記述する必要はありません。
クラスの継承
-
単一継承
文法:
class <类名>(父类名) <语句>
例:
class Student(people): grade = '' def __init__(self,n,a,w,g): #调用父类的构函 people.__init__(self,n,a,w) self.grade = g #覆写父类的方法 def speak(self): print("%s is speaking: I am %d years old,and I am in grade %d"%(self.name,self.age,self.grade)) s = Student('ken',20,60,3) s.speak()
-
クラスの多重継承
文法:
class 类名(父类1, 父类2, ...., 父类n) <语句1>
注: 括弧内は親クラスの順序です。親クラスに同じメソッド名があり、それをサブクラスで使用するときに指定されていない場合、Python は左から右に検索します。つまり、メソッドがサブクラスに見つからない場合は、左から右に検索します。メソッドが親クラスに含まれているかどうかを確認します。