1. オブジェクト指向とは
オブジェクト指向は、現実世界を理解して抽象化する方法であり、コンピュータ プログラミング技術が一定の段階まで発展した成果です。
次に、なぜオブジェクト指向なのか
オブジェクト指向はシステムの保守性、拡張性、再利用性を解決できるからです。
1. C のプロセス指向言語とは異なり、Python のオブジェクト指向アプローチは、客観的な世界で問題について人々が考える方法と一致しています。結局のところ、コンピューターは人々が問題を解決するのを助けるための単なるツールです。非常に複雑なコードを書くことができます。コンピューターの場合、タスクを段階的に迅速かつスムーズに完了できます。しかし、コードの量が急激に増加すると、これらのコードのメンテナンスはより困難になります。
2. プロセス指向は問題を解決するためのステップに焦点を当てます 問題は N 個のステップに分割して実行できますが、プロセス指向は問題の機能に焦点を当てます。現実世界に存在するオブジェクトは問題領域の主人公であり、いわゆるオブジェクトとは、客観的に存在するオブジェクトの実体と主観的な抽象概念を指し、問題を観察し解決することが人間の主な目的です。オブジェクトにはプロパティと動作があります。構造化設計手法で採用される設計思想は、オブジェクト全体を捉えるのではなく、オブジェクトに付随する動作を抽出し、その機能を目標としてアプリケーションシステムを設計・構築することです。このアプローチでは、プログラミング時にオブジェクトで構成される現実世界を機能モジュールで構成される解決空間にマッピングする必要が生じ、この変換プロセスはプログラミングの複雑さを増すだけでなく、問題を観察して解決するという人間の基本的な考え方から逸脱することになります。さらに、よく考えてみると、どの問題領域でも、オブジェクトは安定していますが、動作は不安定であることがわかります。例えば、国立図書館であっても、学校図書館であっても、国際図書館であっても、書籍という対象は存在しますが、書籍の管理方法は全く異なる場合があります。構造化設計アプローチは、不安定な動作に焦点を当て、記述されたオブジェクトの属性と動作を分離するため、将来のアプリケーションの保守と拡張が困難であり、小さな変更でもシステム全体に影響を及ぼします。問題の大規模化、環境の複雑化、要求の変化のスピードの増大に直面して、コンピュータによる問題解決の基本的な方法と人間の習慣的な問題解決方法を統一し、ソフトウェアの設計方法や従来の人間の問題解決方法の歪みを根本的に変えることが差し迫っている、これがオブジェクト指向を提唱する主な理由です。
3. オブジェクト指向の基本概念
3.1 オブジェクト
オブジェクトとは、最も単純な整数から複雑な飛行機など、人間が研究したいものであれば何でもオブジェクトと見なすことができ、特定のものを表すだけでなく、抽象的なルール、計画、イベントを表すこともできます。オブジェクトはオブジェクトを指しており、「すべてがオブジェクト」ではないことに注意してください。
3.2 オブジェクトの状態と動作
オブジェクトは値を使用してその状態を表し、オブジェクトの状態を変更することはオブジェクトの動作です
3.3クラス
クラスは、同じプロパティとメソッドを持つオブジェクトのコレクションです。コレクション内のすべてのオブジェクトに共通のプロパティとメソッドを定義します。オブジェクトはクラスのインスタンスです。
3.4 メッセージ
オブジェクトが通信するための構造はメッセージと呼ばれます。
3.5 方法
クラス内での演算の実装処理をメソッドと呼び、メソッドにはメソッド名、戻り値、パラメータ、メソッド本体があります。
4 つのオブジェクト指向の機能
4.1 オブジェクトの一意性
各オブジェクトには独自の一意の識別子があり、それによって対応するオブジェクトを見つけることができます。異なるオブジェクトが同じ識別子を持つことはできません。
4.2 抽象化
抽象化とは、一貫したデータ構造 (属性) と動作 (操作) を持つオブジェクトをクラスに抽象化することを指します。クラスは、アプリケーションに関連する重要なプロパティを反映し、他の無関係なコンテンツを無視する抽象化です。
4.3 継承
継承は他のプログラミング言語とは異なるオブジェクト指向プログラミング言語の重要な機能の 1 つであり、サブクラスは親クラスまたは複数の親クラスを継承して、コードの拡張性と再利用性を実現します。
4.4 ポリモーフィズム
ポリモーフィズムとは、同じ操作、関数、またはプロセスが複数の種類のオブジェクトに作用し、異なる結果が得られることを意味します。異なるオブジェクトが同じメッセージを受信すると、異なる結果が生じる可能性があり、この現象はポリモーフィズムと呼ばれます。
4.5 カプセル化
オブジェクト指向クラスは適切にカプセル化されたモジュールであり、カプセル化によりソフトウェア内で優れたモジュール性が保証されます。
5、Pythonオブジェクト指向
5.1 基本概念
Python オブジェクト指向は主にクラスとオブジェクトを通じてオブジェクト指向の考え方を実装します。ここでは簡単な概念をいくつか示します。
5.1.1 クラス
同じ属性とメソッドを持つオブジェクトのコレクションを記述するために使用されます。コレクション内のすべてのオブジェクトに共通のプロパティとメソッドを定義します。オブジェクトはクラスのインスタンスです。
5.1.2 クラス変数
クラス内および関数本体の外で定義されたものをクラス変数と呼びます。クラス変数は、インスタンス化されたオブジェクト間で共通です。
5.1.3 データメンバー
クラス変数またはインスタンス変数は、クラスとそのインスタンス オブジェクトに関連するデータを処理するために使用されます。
5.1.4 メソッド
クラスで定義された関数
5.1.5 オブジェクト
オブジェクトはクラスのインスタンス化です。
5.1.6 継承
つまり、派生クラス(派生クラス)は、基底クラス(基底クラス)のフィールドやメソッドを継承します。
5.1.7 メソッドの書き換え
親クラスから継承したメソッドがサブクラスのニーズを満たせない場合は、メソッドを書き換えることができます。このプロセスはメソッド オーバーライドと呼ばれ、メソッドの書き換えとも呼ばれます。
5.1.8 ローカル変数
メソッド内で定義された変数はローカル変数と呼ばれます。
5.1.9 インスタンス変数
インスタンス変数とは、クラスメソッド内に「self.変数名」の形で定義された変数のことを指し、そのメソッドを呼び出したオブジェクトに対してのみ作用するのが特徴です。さらに、インスタンス変数には、クラス名ではなく、オブジェクト名を通じてのみアクセスできます。
5.2 Python定義クラス
Python はclass
キーワードとクラス名を使用してクラスを構築します。次のように:
class TaoBao:
# 类体
class CLanguage :
count = 0
def __init__(self):
self.name = "C语言"
self.age = 18
# 下面定义了一个say实例方法
def say(self):
self.catalog = 13
money = 2000
上記のクラスから次のことがわかります。
パラメータ | 名前 |
---|---|
言語 | クラス名 |
カウント | クラス変数 |
_初期化_ | コンストラクター。クラスオブジェクトの作成時に自動的に呼び出されます。 |
セルフカタログ | インスタンス変数 |
言う() | 方法 |
お金 | ローカル変数 |
5.3 自分自身
self はクラスのインスタンスを表します。self はクラスのメソッドを定義するときに必要ですが、呼び出すときに対応するパラメーターを渡す必要はありません。self を jsonwong などの別のものに置き換えることもできます。コードは次のとおりです。
class Test:
def prt(self):
print(self)
print(self.__class__)
t = Test()
t.prt()
出力:
<__main__.Test object at 0x000001C16F5BB358>
<class '__main__.Test'>
この時点で、次のように self を jsonwong に変更することもできます。
class Test:
def prt(jsonwong):
print(jsonwong)
print(jsonwong.__class__)
t = Test()
t.prt()
出力:
<__main__.Test object at 0x00000212B9F9B358>
<class '__main__.Test'>
5.4 インスタンスオブジェクトの作成
クラスのインスタンス化 new キーワードは他のプログラミング言語では一般的に使用されますが、Python にはそのようなキーワードはなく、クラスのインスタンス化は関数呼び出しに似ています。たとえば、上記のクラス Test は次のように呼び出されます。
t = Test()
t2 = Test()
この場合、 t と t2 はクラス Test の異なるオブジェクトと呼ばれます。
5.5 プロパティとメソッド
クラスのプロパティとメソッドは、class.property\class.method を通じて、またはインスタンス化されたオブジェクトを通じて呼び出すことができます。
object.property-name
object.method-name(parameters...) は、キーワードを使用してメソッドを定義
できます。def
5.5.1 プライベートプロパティ
クラス内でのみ呼び出すことができ、クラス外からは呼び出すことができないプロパティを指します。プライベート プロパティは__
+ プロパティ名で構成されます。クラス内のメソッドで使用する場合は、self.__ 属性名を使用します。
5.5.2 プライベートメソッド
クラス内でのみ呼び出すことができ、クラス外では呼び出すことができないメソッドのことを指し、プライベートメソッドは__
+メソッド名(パラメータ)で構成されます。クラス内のメソッドで使用する場合は、self.__ メソッド名 (パラメータ) を使用します。
5.5.3 例
class Test:
__money = 2000
name = "jsonwong"
def func_1(self):
s = self.__money
c = self.__func()
print(s,c, "公共方法")
def __func(self):
return "私有方法"
t = Test()
print(t.name)
# print(t.__money) # 报错,实例化对象不能访问私有属性
t.func_1()
# t.__func() # 报错,实例化对象不能访问私有方法
上記の例では、プライベート プロパティとメソッドはクラス内で呼び出すことができますが、クラス外では呼び出すことができないことが明確にわかります。object._className__attrName
ただし、次のように、オブジェクト名._クラス名__プライベート属性名 (メソッド)を通じてアクセスできます。
print(t._Test__money)
出力:
2000
5.5.4 インスタンスバインディングプロパティ
インスタンスは、次の 2 つの方法でプロパティにバインドできます。
1. 自己コンストラクターを介してプロパティをインスタンスにバインドします。 2.
1 つは直接代入です
が、注意が必要です。
1. オブジェクト プロパティはクラス プロパティよりも優れています
2. インスタンス プロパティはクラス プロパティよりも優れています
3. オブジェクト内のクラス プロパティの値を変更すると、現在のオブジェクトに新しいオブジェクト プロパティが作成されます
。
class Person(object):
name = "person"
def __init__(self,name):
self.name = name
# 调用类的属性
print(Person.name)
person_1 = Person("DD")
# 实例的属性优先于类的属性
print(person_1.name)
person_1.age = 22
print(person_1.age) # 对象临时添加的属性,只对当前对象起作用,其它的都免提
出力:
person
DD
22
5.5.5 クラスバインディングプロパティ
クラスは、class.properties を通じてプロパティを直接バインドできます。クラス プロパティは、クラスのメソッドとインスタンス化されたオブジェクトの両方で共有されることに注意してください。
class Person(object):
name = "person"
def __init__(self,name):
self.name = name
Person.money = 2000
per = Person("wx")
print(Person.money)
print(per.money)
出力:
2000
2000
5.5.7 インスタンスバインディングメソッド
# 对象绑定方法
from types import MethodType
class Stu():
# 构造方法
def __init__(self):
print("I am a stu")
def set_age(self,age):
self.age = age
# 我想把set_age方法放入到Stu
s = Stu()
s.set_age = MethodType(set_age,s)
s.set_age(18)
print(s.age)
出力:
I am a stu
18
**注意:** メソッドを 1 つのインスタンスにバインドしても、別のインスタンスでは機能せず、現在のインスタンスでのみ機能します。
5.5.8 クラスバインドされたメソッド
# 类绑定方法
from types import MethodType
class Stu():
# 构造方法
def __init__(self):
print("I am a stu")
def set_age(self,age):
self.age = age
# 把set_age嵌入到类里
Stu.set_age = MethodType(set_age,Stu)
注: メソッドがクラスにバインドされた後は、すべてのインスタンスを呼び出すことができ、バインドされたプロパティはパブリック プロパティとなり、すべてのオブジェクトによって変更できます。
5.5.9 スロットは属性を追加するクラス インスタンスを制限します
スロットはクラス インスタンスに追加できる属性を制限します。追加された属性がスロットの範囲内にない場合は、エラーが報告されます。次のように:
class Stu():
__slots__ = ("name","age","height") # 用元组定义允许绑定属性名称
注: __slots__ を使用する場合、__slots__ は、継承されたサブクラスではなく、現在のクラスでのみ機能する属性を定義することに注意してください。複数の属性名は、タプル、セット、リストの形式で表現できます。