オブジェクト指向プログラミングの基礎: カプセル化、継承、ポリモーフィズム、抽象化の包括的な分析

オブジェクト指向の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親クラスを継承しParentsuper().__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()この抽象メソッドには特定の実装はありませんが、実装はサブクラスに任されています。次に、Dog2 つの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()ShapeRectangleCircleShape

構成とインターフェイスはオブジェクト指向プログラミングにおける非常に重要な概念と手法であり、より柔軟で拡張可能なコードを構築するのに役立ちます。

要約する

オブジェクト指向プログラミング (略して OOP) は、コードを編成および管理するためのプログラミング パラダイムです。これはオブジェクトの概念に基づいており、データと操作を独立したエンティティにカプセル化し、クラス間の対話を通じてコードの柔軟性、可読性、保守性を実現します。

オブジェクト指向プログラミングには、次の基本的な特徴があります。

カプセル化: エンティティ内のデータとデータに対する操作をカプセル化し、アクセス制御を通じて内部実装の詳細を隠し、コードのセキュリティとモジュール性を向上させます。

継承: 継承メカニズムを通じて、クラスを別のクラスから派生し、親クラスの属性とメソッドを継承し、これに基づいて拡張または変更して、コードの再利用と階層設計を実現できます。

ポリモーフィズム: 異なるオブジェクトで呼び出された場合、同じメソッドが異なる動作を生成する可能性があります。ポリモーフィズムを通じて、統一されたインターフェイスを使用してさまざまなタイプのオブジェクトを処理でき、コードの柔軟性とスケーラビリティが向上します。

抽象化: 抽象クラスまたはインターフェイスを通じて仕様と制約を定義し、実装の詳細を隠し、コードの高レベルのロジックと全体的なアーキテクチャを強調し、コードのモジュール性と保守性を向上させます。

オブジェクト指向プログラミングでは、クラスを定義してオブジェクトを作成し、オブジェクト メソッドを呼び出して特定の機能を実現します。複数のオブジェクトを組み合わせることで、より複雑なシステムやデータ構造を構築できます。

さらに、オブジェクト指向プログラミングでは、単一責任原則、オープンクローズド原則、設計パターンなどのいくつかの設計原則とパターンも導入されており、凝集性が高く、結合性が低く、スケーラビリティが高く、メンテナンスが容易なコードを設計するのに役立ちます。 。

オブジェクト指向プログラミングの基礎を学ぶことで、このプログラミング パラダイムをよりよく理解して適用し、ソフトウェア開発能力を向上させることができます。

おすすめ

転載: blog.csdn.net/qq_41308872/article/details/132852949
おすすめ