技術共有

[Python オブジェクト指向] プログラミングを探索する: 新時代の高度なプログラミング パラダイムの詳細な説明

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

目次

1. オブジェクト指向プログラミングの概念 (OOP)

1.1 クラスとオブジェクトとは何ですか?

1.2 クラス定義

1.3 クラスとオブジェクトの関係

1.4 Xiao Liの理解

2. 抽象化化

2.1 抽象的な概念

2.2 抽象クラスとメソッド

2.3 Xiao Liの理解

3. クラスとインスタンス

3.1 クラスの定義とインスタンス化

3.2 クラスの属性とメソッド

3.3 Xiao Liの理解

4. カプセル化/インターフェース

4.1 カプセル化の概念

4.2 インターフェースの概念

4.3 Xiao Liの理解

5. 継承

5.1 継承の概念

5.2 メソッドの書き換え

5.3 Xiao Liの理解

6. ポリモーフィズム

6.1 ポリモーフィズムの概念

6.2 ポリモーフィズムの実装

6.3 Xiao Liの理解

7. 内省/反省

7.1 内省の概念

7.2 動的操作のためのイントロスペクションの使用

7.3 Xiao Liの理解

8. 静的メソッドとクラスメソッド

8.1 静的メソッド

8.2 クラスメソッド

要約する


 

コラム:Python勉強メモ

前編: Python のモジュール化とパッケージ管理

1. オブジェクト指向プログラミングの概念 (OOP)

オブジェクト指向プログラミング (OOP) プログラムをオブジェクトのコレクションに編成することで実装されるプログラミング パラダイムです。オブジェクトにはデータだけでなく、そのデータを操作するメソッドも含まれます。 OOP の中核となる概念には、クラス、オブジェクト、プロパティ、メソッドが含まれます。

1.1 クラスとオブジェクトとは何ですか?

  • クラス オブジェクトの作成に使用されるテンプレートまたはブループリントです。クラスはオブジェクトのプロパティと動作を定義します。
  • 物体 クラスのインスタンスです。オブジェクトの作成とは、クラスに基づいて特定のインスタンスを作成することです。

例:

  1. class Dog:
  2. # 类的初始化方法
  3. def __init__(self, name, age):
  4. self.name = name # 属性
  5. self.age = age # 属性
  6. # 方法
  7. def bark(self):
  8. return f"{self.name} says Woof!"
  9. # 创建对象
  10. my_dog = Dog("Rex", 5)
  11. print(my_dog.bark())

1.2 クラス定義

Python ではクラスは渡されます class キーワードの定義。クラス内の関数はメソッドと呼ばれ、変数はプロパティと呼ばれます。クラスメソッドは通常次で始まりますself 最初のパラメータとして、インスタンス自体を表します。

例:

  1. class Cat:
  2. def __init__(self, name):
  3. self.name = name
  4. def meow(self):
  5. return f"{self.name} says Meow!"
  6. # 创建对象
  7. my_cat = Cat("Whiskers")
  8. print(my_cat.meow())

1.3 クラスとオブジェクトの関係

クラスはオブジェクトのテンプレートであり、オブジェクトの構造と動作を定義します。オブジェクトはクラスのインスタンスであり、各オブジェクトには独立したプロパティとメソッドがあります。

  1. class Person:
  2. def __init__(self, name, age):
  3. self.name = name
  4. self.age = age
  5. def greet(self):
  6. return f"Hello, my name is {self.name} and I am {self.age} years old."
  7. # 创建多个对象
  8. person1 = Person("Alice", 30)
  9. person2 = Person("Bob", 25)
  10. print(person1.greet())
  11. print(person2.greet())

1.4 Xiao Liの理解

クラスはクッキーの型のようなもので、クッキーの形状とサイズを定義します。オブジェクトは、型から作られる具体的なクッキーのようなもので、それぞれのクッキーは異なるフレーバー (特性) を持つことができますが、その形状とサイズ (構造と動作) は同じです。

2. 抽象化化

抽象的な これは、主要な特徴を捉えて詳細を無視することによって、複雑な現実世界の問題を単純化することを指します。プログラミングでは、抽象化により、より簡潔で保守しやすいコードを作成できます。

2.1 抽象的な概念

抽象化とは、重要でない詳細を無視して、オブジェクトの主な特徴を抽出することです。抽象化により、二次的な機能に気を取られることなく、オブジェクトの中核となる機能に集中できます。

例:

  1. class Animal:
  2. def __init__(self, name):
  3. self.name = name
  4. def make_sound(self):
  5. pass # 抽象方法,不具体实现
  6. class Dog(Animal):
  7. def make_sound(self):
  8. return "Woof!"
  9. class Cat(Animal):
  10. def make_sound(self):
  11. return "Meow!"
  12. # 创建对象
  13. dog = Dog("Rex")
  14. cat = Cat("Whiskers")
  15. print(dog.make_sound())
  16. print(cat.make_sound())

2.2 抽象クラスとメソッド

Python では、抽象クラスと抽象メソッドを定義することで抽象化を実現できます。抽象クラスはインスタンス化できず、継承のみが可能です。抽象メソッドは抽象クラスで定義されますが、サブクラスで実装されます。

例:

  1. from abc import ABC, abstractmethod
  2. class Vehicle(ABC):
  3. @abstractmethod
  4. def start_engine(self):
  5. pass
  6. class Car(Vehicle):
  7. def start_engine(self):
  8. return "Car engine started"
  9. class Motorcycle(Vehicle):
  10. def start_engine(self):
  11. return "Motorcycle engine started"
  12. # 创建对象
  13. car = Car()
  14. motorcycle = Motorcycle()
  15. print(car.start_engine())
  16. print(motorcycle.start_engine())

2.3 Xiao Liの理解

抽象化は、複雑な絵画を幾何学的な形状に縮小するようなものです。たとえば、特定の猫には多くの特徴(毛色、大きさ、年齢など)がありますが、ここでは鳴き声の特徴だけに焦点を当てます。これは猫の抽象化です。

3. クラスとインスタンス

クラスとインスタンス OOPの基礎となります。クラスはテンプレートであり、インスタンスは具体的なオブジェクトです。インスタンスはクラスから作成され、クラスによって定義されたプロパティとメソッドを持ちます。

3.1 クラスの定義とインスタンス化

クラスの定義とインスタンスの作成は、OOP の基本的な操作です。クラスはプロパティとメソッドを定義し、インスタンスはクラスの具体的なオブジェクトです。

例:

  1. class Student:
  2. def __init__(self, name, grade):
  3. self.name = name
  4. self.grade = grade
  5. def introduce(self):
  6. return f"Hi, I am {self.name} and I am in grade {self.grade}."
  7. # 创建实例
  8. student1 = Student("Alice", 10)
  9. student2 = Student("Bob", 12)
  10. print(student1.introduce())
  11. print(student2.introduce())

3.2 クラスの属性とメソッド

クラスの属性はオブジェクトの状態であり、メソッドはオブジェクトの動作です。クラス属性のパス __init__ メソッドの初期化。メソッドはクラス内に定義されます。

例:

  1. class Book:
  2. def __init__(self, title, author):
  3. self.title = title
  4. self.author = author
  5. def get_info(self):
  6. return f"'{self.title}' by {self.author}"
  7. # 创建实例
  8. book = Book("1984", "George Orwell")
  9. print(book.get_info())

3.3 Xiao Liの理解

クラスとインスタンスは、家の図面と実際の家のようなものです。図面 (クラス) は家の構造と機能を定義しますが、実際の家 (インスタンス) は図面に従って構築された具体的なオブジェクトです。

4. カプセル化/インターフェース

カプセル化 オブジェクトのステータス (プロパティ) と動作 (メソッド) をクラス内に隠し、インターフェイス (メソッド) を通じて外部と対話します。カプセル化により、コードのセキュリティと保守性が向上します。

4.1 カプセル化の概念

カプセル化は、OOP の中心的な概念の 1 つであり、オブジェクトの内部状態を隠し、必要なインターフェイスのみを公開することでオブジェクトのデータを保護します。このように、外部コードはオブジェクトの内部状態に直接アクセスしたり変更したりすることはできず、オブジェクトが提供するメソッドを通じてのみデータを操作できます。

例:

  1. class Account:
  2. def __init__(self, owner, balance=0):
  3. self.owner = owner
  4. self.__balance = balance # 私有属性
  5. def deposit(self, amount):
  6. if amount > 0:
  7. self.__balance += amount
  8. else:
  9. raise ValueError("Deposit amount must be positive")
  10. def withdraw(self, amount):
  11. if 0 < amount <= self.__balance:
  12. self.__balance -= amount
  13. else:
  14. raise ValueError("Insufficient funds or invalid amount")
  15. def get_balance(self):
  16. return self.__balance
  17. # 创建实例
  18. account = Account("John")
  19. account.deposit(100)
  20. print(account.get_balance())

4.2 インターフェースの概念

インターフェイスは、オブジェクトが外界と対話する唯一の方法です。インターフェイスを通じて、外部コードはオブジェクトのメソッドを呼び出すことができますが、オブジェクトの内部状態に直接アクセスすることはできません。

例:

  1. class Car:
  2. def __init__(self, model):
  3. self.model = model
  4. self.__engine_started = False
  5. def start_engine(self):
  6. if not self.__engine_started:
  7. self.__engine_started = True
  8. return "Engine started"
  9. else:
  10. return "Engine is already running"
  11. def stop_engine(self):
  12. if self.__engine_started:
  13. self.__engine_started = False
  14. return "Engine stopped"
  15. else:
  16. return "Engine is not running"
  17. # 创建实例
  18. car = Car("Toyota")
  19. print(car.start_engine())
  20. print(car.stop_engine())

4.3 Xiao Liの理解

パッケージは携帯電話の筐体のようなものです。携帯電話内部の回路や部品(物体の状態)は筐体内に封入されており、ユーザーはボタンや画面(インターフェース)を通じてのみ携帯電話と対話することができ、内部部品に直接接触することはできません。

5. 継承

継承する これは、OOP のもう 1 つの中心的な概念であり、既存のクラスに基づいて新しいクラスを作成し、既存のクラスのすべてのプロパティとメソッドを継承します。

5.1 継承の概念

継承とは、あるクラス (サブクラス) が別のクラス (親クラス) からプロパティやメソッドを取得することです。継承を通じて、サブクラスは親クラスのコードを再利用したり、新しいプロパティやメソッドを追加したり、親クラスのメソッドをオーバーライドしたりできます。

例:

  1. class Animal:
  2. def __init__(self, name):
  3. self.name = name
  4. def speak(self):
  5. pass
  6. class Dog(Animal):
  7. def speak(self):
  8. return "Woof!"
  9. class Cat(Animal):
  10. def speak(self):
  11. return "Meow!"
  12. # 创建实例
  13. dog = Dog("Rex")
  14. cat = Cat("Whiskers")
  15. print(dog.speak())
  16. print(cat.speak())

5.2 メソッドの書き換え

サブクラスは親クラスのメソッドをオーバーライドできます。つまり、サブクラス内で親クラスと同じ名前のメソッドを定義して、異なる機能を実現できます。

例:

  1. class Shape:
  2. def area(self):
  3. return 0
  4. class Rectangle(Shape):
  5. def __init__(self, width, height):
  6. self.width = width
  7. self.height = height
  8. def area(self):
  9. return self.width * self.height
  10. class Circle(Shape):
  11. def __init__(self, radius):
  12. self.radius = radius
  13. def area(self):
  14. return 3.14 * (self.radius ** 2)
  15. # 创建实例
  16. rectangle = Rectangle(3, 4)
  17. circle = Circle(5)
  18. print(rectangle.area())
  19. print(circle.area())

5.3 Xiao Liの理解

相続は親から子に与えられる遺産のようなものです。親(親クラス)は自分のプロパティ(プロパティやメソッド)を子(サブクラス)に渡し、子はそれらのプロパティを使用できるだけでなく、自分の努力(新しいプロパティやメソッドの追加)によってより豊かになります。

6. ポリモーフィズム

ポリモーフィズム これは、同じメソッドが異なるオブジェクト上で異なる表現を持つことを意味します。ポリモーフィズムを使用すると、同じインターフェイスを通じてさまざまなオブジェクトのメソッドを呼び出し、さまざまな機能を実現できます。

6.1 ポリモーフィズムの概念

ポリモーフィズムは OOP の重要な機能の 1 つであり、親クラス参照を通じてサブクラス オブジェクトを指し、同じメソッドが異なる実装を持つことができます。ポリモーフィズムにより、コードの柔軟性とスケーラビリティが向上します。

例:

  1. class Animal:
  2. def speak(self):
  3. pass
  4. class Dog(Animal):
  5. def speak(self):
  6. return "Woof!"
  7. class Cat(Animal):
  8. def speak(self):
  9. return "Meow!"
  10. def animal_sound(animal):
  11. print(animal.speak())
  12. # 创建实例
  13. dog = Dog()
  14. cat = Cat()
  15. animal_sound(dog)
  16. animal_sound(cat)

 

6.2 ポリモーフィズムの実装

Python では、ポリモーフィズムは通常、メソッドのオーバーライドと親クラスの参照を通じて実装されます。親クラス参照を通じてサブクラス オブジェクトを指すことにより、サブクラス メソッドを呼び出すことができます。

例:

  1. class Shape:
  2. def draw(self):
  3. pass
  4. class Rectangle(Shape):
  5. def draw(self):
  6. return "Drawing a rectangle"
  7. class Circle(Shape):
  8. def draw(self):
  9. return "Drawing a circle"
  10. def draw_shape(shape):
  11. print(shape.draw())
  12. # 创建实例
  13. rectangle = Rectangle()
  14. circle = Circle()
  15. draw_shape(rectangle)
  16. draw_shape(circle)

 

6.3 Xiao Liの理解

ポリモーフィズムは万能リモコンのようなものです。テレビ、エアコン、ステレオなどの制御であっても、これらのデバイスに対応するインターフェイス (メソッド) がある限り、リモコン (親クラス参照) は同じボタン (メソッド呼び出し) を通じてさまざまな機能を実装できます。

7. 内省/反省

内省 これは、オブジェクトが実行時に自身の情報を知ることができることを意味します。 Python には、以下のようなイントロスペクション用の組み込み関数がいくつか用意されています。type()id()hasattr() 待って。

7.1 内省の概念

イントロスペクションとは、オブジェクトが実行時にプロパティやメソッドなどの独自の情報を取得できることを意味します。イントロスペクションにより、Python プログラムは非常に動的かつ柔軟になります。

例:

  1. class Person:
  2. def __init__(self, name, age):
  3. self.name = name
  4. self.age = age
  5. person = Person("Alice", 30)
  6. # 使用内置函数进行自省
  7. print(type(person))
  8. print(hasattr(person, "name"))
  9. print(getattr(person, "name"))
  10. setattr(person, "name", "Bob")
  11. print(person.name)
  12. delattr(person, "name")

7.2 動的操作のためのイントロスペクションの使用

イントロスペクションを通じて、実行時にオブジェクトのプロパティとメソッドを動的に操作できるため、プログラムがより柔軟で動的になります。

例:

  1. class Car:
  2. def __init__(self, model):
  3. self.model = model
  4. self.speed = 0
  5. def accelerate(self):
  6. self.speed += 5
  7. return self.speed
  8. car = Car("Toyota")
  9. # 动态操作对象
  10. if hasattr(car, "accelerate"):
  11. method = getattr(car, "accelerate")
  12. print(method())
  13. print(method())
  14. # 动态设置属性
  15. setattr(car, "color", "red")
  16. print(car.color)

7.3 Xiao Liの理解

自己検査は鏡を見るようなものです。鏡(内省メカニズム)を通して、人々は自分がどのように見えるか(オブジェクトのプロパティとメソッド)を確認し、必要に応じて調整を行うことができます(オブジェクトの動的操作)。

8. 静的メソッドとクラスメソッド

静的メソッド そしてクラスメソッド インスタンスではなくクラスに関連付けられたメソッドです。静的メソッドの使用法@staticmethod デコレータ、クラスメソッドの使用法@classmethod デコレーター。

8.1 静的メソッド

静的メソッドはクラスのメソッドですが、どのクラス インスタンスにもバインドされません。静的メソッドはクラスのインスタンスにアクセスしたり、クラスの状態を変更したりすることはできません。これらは通常、クラスとは関係のない何らかの操作を実行するために使用されますが、論理的にはクラスの機能に属します。

例:

  1. class Math:
  2. @staticmethod
  3. def add(a, b):
  4. return a + b
  5. print(Math.add(5, 3))

 

8.2 クラスメソッド

クラス メソッドは、インスタンスではなくクラスにバインドされるメソッドです。クラスメソッドの最初の引数はクラス自体であり、通常は名前が付けられます。 cls 。クラス メソッドは、クラスのプロパティや他のクラス メソッドにアクセスできます。

例:

  1. class Math:
  2. factor = 2
  3. @classmethod
  4. def multiply(cls, value):
  5. return cls.factor * value
  6. print(Math.multiply(5))

要約する

オブジェクト指向プログラミングの基本概念、抽象化、クラスとインスタンス、カプセル化、継承、ポリモーフィズム、イントロスペクション、静的メソッドとクラス メソッドを含む、Python によるオブジェクト指向プログラミングのあらゆる側面。

この詳細なブログが、Python のオブジェクト指向プログラミングを深く理解し、その知識を実際のプロジェクトに適用するのに役立つことを願っています。ご質問がある場合、またはさらにサポートが必要な場合は、お気軽にご連絡ください。