記事ディレクトリ
オブジェクト指向の3大特徴
オブジェクト指向プログラミングには、カプセル化、継承、ポリモーフィズムという 3 つの主要な特徴があります。
- カプセル化: カプセル化では、オブジェクトのデータとデータ操作メソッドをカプセル化して、オブジェクトのデータへの外部からの直接アクセスを回避することで、オブジェクト内のデータのセキュリティを確保します。
- 継承: 継承によりオブジェクトのスケーラビリティが確保され、サブクラスは親クラスの属性とメソッドを継承し、これに基づいて拡張できます。
- ポリモーフィズム: ポリモーフィズムにより、プログラムの柔軟性が保証され、異なるタイプのオブジェクトが同じメッセージに対して異なる応答を行うことができます。
クラスやオブジェクトなどのオブジェクト指向プログラミングの基礎
オブジェクト指向プログラミングでは、通常、クラスとオブジェクトを定義します。クラスは類似したオブジェクトのクラスの抽象的な記述ですが、オブジェクトは具体的なインスタンスです。クラスとオブジェクトの概念とそれらの間の関係を見てみましょう。
クラスを定義する
class A(object):
# 类属性
count = 0
def __init__(self):
# 实例属性
self.name = '孙悟空'
def test(self):
# 实例方法
print('这是test方法~~~', self)
@classmethod
def test_2(cls):
# 类方法
print('这是test_2方法,他是一个类方法~~~', cls)
print(cls.count)
@staticmethod
def test_3():
# 静态方法
print('test_3执行了~~~')
上記のコードでは、クラスを定義しましたA
。で:
count
クラスまたはインスタンスを通じてアクセスできるクラス属性であり、クラス オブジェクトを通じてのみ変更できます。__init__()
これはインスタンスのプロパティを初期化するために使用されるコンストラクター メソッドであり、オブジェクトの作成時に自動的に呼び出されます。test()
self
第一引数としてインスタンスのプロパティを操作するインスタンスメソッドです。test_2()
cls
第一引数にクラス属性を操作するクラスメソッドです。test_3()
これは静的メソッドであり、デフォルトのパラメーターを指定する必要はなく、現在のクラスとは何の関係もありません。
オブジェクトを作成してメソッドを呼び出す
a = A()
a.test()
A.test_2()
A.test_3()
上記のコードでは、オブジェクトを作成しa
、インスタンス オブジェクトを通じてインスタンス メソッドを呼び出しますtest()
。次に、クラス オブジェクトを通じてクラス メソッドtest_2()
と静的メソッドを呼び出しましたtest_3()
。
これがクラスとオブジェクトの基本的な概念と使用法です。次に、オブジェクト指向プログラミングの他の機能を引き続き調査していきます。
オブジェクト指向プログラミングの基礎: 継承とポリモーフィズム
オブジェクト指向プログラミングでは、継承とポリモーフィズムはコードの再利用性と柔軟性を向上させる 2 つの重要な概念です。継承とポリモーフィズムの使い方と特徴を一緒に学びましょう。
継承する
継承は、1 つ以上の既存のクラスを継承する新しいクラスを作成できるようにするオブジェクト指向プログラミングのメカニズムです。継承されたクラスは親クラス (または基本クラス) と呼ばれ、新しく作成されたクラスはサブクラス (または派生クラス) と呼ばれます。サブクラスは親クラスのプロパティとメソッドを継承し、これに基づいて拡張および変更できます。
# 定义一个父类
class Parent(object):
def __init__(self):
self.parent_attr = '父类属性'
def parent_method(self):
print('这是父类方法')
# 定义一个子类,继承父类
class Child(Parent):
def __init__(self):
# 调用父类的构造方法
super().__init__()
self.child_attr = '子类属性'
def child_method(self):
print('这是子类方法')
上記のコードでは、親クラスParent
と子クラスを定義しますChild
。サブクラスはChild
親クラスを継承しParent
、super().__init__
親クラスのコンストラクターを呼び出すことで親クラスのプロパティとメソッドを取得します。サブクラスは、これに独自のプロパティとメソッドを追加できます。
ポリモーフィズム
ポリモーフィズムは、オブジェクト指向プログラミングにおける非常に強力な機能です。これにより、親クラスの参照を使用してサブクラスのオブジェクトを指すことができるため、柔軟なコード設計が実現します。ポリモーフィズムにより、さまざまなサブクラスのオブジェクトを統一した方法で処理できるようになります。
# 使用多态调用父类方法
def invoke_method(obj):
obj.parent_method()
# 创建父类和子类对象
parent = Parent()
child = Child()
# 调用父类方法
invoke_method(parent)
invoke_method(child)
上記のコードでは、invoke_method
親クラスのオブジェクトをパラメータとして受け取り、親クラスのメソッドを呼び出す関数を定義しています。次に、親クラス オブジェクトparent
と子クラス オブジェクトを作成し、それぞれ呼び出し用の関数child
に渡します。invoke_method
ポリモーフィズムの特性により、親クラスのオブジェクトであっても、サブクラスのオブジェクトであっても、親クラスのメソッドは正常に呼び出すことができます。
継承とポリモーフィズムはオブジェクト指向プログラミングにおける非常に重要な概念と手法であり、コードの保守性とスケーラビリティを大幅に向上させることができます。
ポリモーフィズムはオブジェクト指向の 3 つの主要な特徴の 1 つです
ポリモーフィズムは、オブジェクト指向プログラミングにおける重要な機能であり、異なるタイプのオブジェクトが同じメッセージに対して異なる応答を行うことができます。ポリモーフィズムの概念では、オブジェクトは複数の形式で表現できます。
2 つのクラスを定義する
まず、2 つのクラス A と B を定義し、それらにいくつかのメソッドとプロパティを追加します。これら 2 つのクラスはそれぞれ異なるオブジェクト タイプを表します。
class A:
def __init__(self, name):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self, name):
self._name = name
class B:
def __init__(self, name):
self._name = name
def __len__(self):
return 10
@property
def name(self):
return self._name
@name.setter
def name(self, name):
self._name = name
class C:
pass
a = A('孙悟空')
b = B('猪八戒')
c = C()
関数を定義する
say_hello(obj)
次に、 1 つのパラメータを受け入れる関数を定義しますobj
。この関数はオブジェクトの特定のタイプを考慮しません。オブジェクトに属性が含まれている限りname
、それをパラメーターとして関数に渡すことができます。
def say_hello(obj):
print('你好 %s' % obj.name)
この時点で、say_hello
関数を呼び出してさまざまなタイプのオブジェクトをパラメータとして渡すことができ、関数はオブジェクトのプロパティに基づいて対応する挨拶を出力します。
say_hello(a) # 输出:你好 孙悟空
say_hello(b) # 输出:你好 猪八戒
アヒル型
オブジェクト指向プログラミングでは、ダック タイピングは動的タイピングの概念です。オブジェクトの適合性は、継承関係や特定のインターフェイスの実装ではなく、オブジェクトが所有するメソッドとプロパティに基づいています。
関数を例に挙げると、オブジェクトに特別なメソッドlen()
があれば、その長さを取得できます。__len__
len()
l = [1, 2, 3]
s = 'hello'
print(len(l)) # 输出:3
print(len(s)) # 输出:5
print(len(b)) # 输出:10
print(len(c)) # 报错:AttributeError: 'C' object has no attribute '__len__'
len()
上記のコードでは、関数を通じてリストl
と文字列の長さは取得できますs
が、C
クラスの長さは取得できないことがわかります。これは、クラスはメソッドB
を定義しますが、クラスはメソッドを定義しないためです。__len__
C
オブジェクト指向プログラミングに基づくカプセル化と抽象化
オブジェクト指向プログラミングでは、カプセル化と抽象化は、コードをより適切に整理および管理するのに役立つ 2 つの重要な概念です。カプセル化と抽象化の使い方と特徴を学びましょう。
カプセル化
カプセル化は、データとデータを操作するメソッドを 1 つのユニットにカプセル化し、特定の実装の詳細を外部から隠すオブジェクト指向プログラミングのメカニズムです。カプセル化を通じて、データとメソッドを論理的な全体に編成し、コードの読みやすさと保守性を向上させることができます。
class Student(object):
def __init__(self, name, age):
self.name = name
self.age = age
def get_name(self):
return self.name
def set_name(self, name):
self.name = name
def get_age(self):
return self.age
def set_age(self, age):
self.age = age
student = Student('张三', 18)
print(student.get_name()) # 输出:张三
print(student.get_age()) # 输出:18
student.set_name('李四')
student.set_age(20)
print(student.get_name()) # 输出:李四
print(student.get_age()) # 输出:20
上記のコードでは、Student
生徒の名前と年齢の属性をカプセル化し、属性値を取得および設定するためのメソッドを提供するクラスを定義します。このようにして、属性のアクセス許可を制御できるだけでなく、属性の適切な検証と処理を実行できます。
抽象的な
抽象化はオブジェクト指向プログラミングにおける重要な原則であり、共通のプロパティとメソッドを抽象クラスまたはインターフェイスに抽象化します。抽象クラスはインスタンス化できず、他のクラスの親クラスとしてのみ機能します。サブクラスは、抽象クラスで定義されたすべての抽象メソッドを実装する必要があります。
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def make_sound(self):
pass
class Dog(Animal):
def make_sound(self):
print('汪汪汪')
class Cat(Animal):
def make_sound(self):
print('喵喵喵')
#animal = Animal() # 错误,抽象类不能被实例化
dog = Dog()
dog.make_sound() # 输出:汪汪汪
cat = Cat()
cat.make_sound() # 输出:喵喵喵
Animal
上記のコードでは、抽象メソッドを含む抽象クラスを定義しますmake_sound()
。この抽象メソッドには特定の実装はありませんが、実装はサブクラスに任されています。次に、Dog
2 つのCat
サブクラスを作成し、それぞれ抽象メソッドを実装しました。抽象クラスを使用すると、特定のメソッドがサブクラスに実装されるようになります。
カプセル化と抽象化は、オブジェクト指向プログラミングにおける非常に重要な概念と手法であり、より信頼性が高くスケーラブルなコードを構築するのに役立ちます。
オブジェクト指向プログラミングの基礎: 構成とインターフェイス
オブジェクト指向プログラミングには、継承とポリモーフィズムに加えて、合成とインターフェイスという 2 つの重要な概念があります。組み合わせやインターフェースの使い方や特徴を学びましょう。
組み合わせ
構成とは、異なるクラスを組み合わせて、より大きなクラスを形成することを指します。合成を通じて、1 つのクラス内の他のクラスのオブジェクトをそのプロパティとして参照し、より複雑なオブジェクト構造を構築できます。
class Engine:
def start(self):
print("引擎启动")
def stop(self):
print("引擎停止")
class Car:
def __init__(self):
self.engine = Engine()
def drive(self):
self.engine.start()
print("汽车行驶中")
self.engine.stop()
car = Car()
car.drive()
上記のコードでは、Car
クラスとEngine
クラスを定義しました。Car
クラスは、オブジェクトを属性として使用してEngine
エンジンの組み合わせを実装します。このようにして、クラス内のオブジェクトのメソッドをCar
呼び出して、車の開始および停止機能を実装できます。Engine
インターフェース
インターフェイスは、クラスが持つべきプロパティとメソッドを指定する規則です。オブジェクト指向プログラミングでは、インターフェイスは関連する一連の操作を記述しますが、特定の実装はありません。インターフェイスを通じて、コードの柔軟性と置き換え可能性を実現するための共通の動作標準セットを定義できます。
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self):
pass
@abstractmethod
def perimeter(self):
pass
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
def perimeter(self):
return 2 * (self.width + self.height)
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14 * self.radius * self.radius
def perimeter(self):
return 2 * 3.14 * self.radius
rectangle = Rectangle(5, 3)
print(rectangle.area()) # 输出:15
print(rectangle.perimeter()) # 输出:16
circle = Circle(4)
print(circle.area()) # 输出:50.24
print(circle.perimeter()) # 输出:25.12
上記のコードでは、 2 つの抽象メソッドとShape
を含むインターフェイスを定義します。次に、インターフェイスを実装する 2 つのサブクラス、および を作成しました。インターフェイスを使用すると、そのインターフェイスを実装するすべてのクラスが同じメソッドを持つようになり、コードの統一された処理が実現します。area()
perimeter()
Shape
Rectangle
Circle
Shape
構成とインターフェイスはオブジェクト指向プログラミングにおける非常に重要な概念と手法であり、より柔軟で拡張可能なコードを構築するのに役立ちます。
要約する
オブジェクト指向プログラミング (略して OOP) は、コードを編成および管理するためのプログラミング パラダイムです。これはオブジェクトの概念に基づいており、データと操作を独立したエンティティにカプセル化し、クラス間の対話を通じてコードの柔軟性、可読性、保守性を実現します。
オブジェクト指向プログラミングには、次の基本的な特徴があります。
カプセル化: エンティティ内のデータとデータに対する操作をカプセル化し、アクセス制御を通じて内部実装の詳細を隠し、コードのセキュリティとモジュール性を向上させます。
継承: 継承メカニズムを通じて、クラスを別のクラスから派生し、親クラスの属性とメソッドを継承し、これに基づいて拡張または変更して、コードの再利用と階層設計を実現できます。
ポリモーフィズム: 異なるオブジェクトで呼び出された場合、同じメソッドが異なる動作を生成する可能性があります。ポリモーフィズムを通じて、統一されたインターフェイスを使用してさまざまなタイプのオブジェクトを処理でき、コードの柔軟性とスケーラビリティが向上します。
抽象化: 抽象クラスまたはインターフェイスを通じて仕様と制約を定義し、実装の詳細を隠し、コードの高レベルのロジックと全体的なアーキテクチャを強調し、コードのモジュール性と保守性を向上させます。
オブジェクト指向プログラミングでは、クラスを定義してオブジェクトを作成し、オブジェクト メソッドを呼び出して特定の機能を実現します。複数のオブジェクトを組み合わせることで、より複雑なシステムやデータ構造を構築できます。
さらに、オブジェクト指向プログラミングでは、単一責任原則、オープンクローズド原則、設計パターンなどのいくつかの設計原則とパターンも導入されており、凝集性が高く、結合性が低く、スケーラビリティが高く、メンテナンスが容易なコードを設計するのに役立ちます。 。
オブジェクト指向プログラミングの基礎を学ぶことで、このプログラミング パラダイムをよりよく理解して適用し、ソフトウェア開発能力を向上させることができます。