オブジェクト指向プログラミング (OOP): クラスとカプセル化の重要な概念を理解する

物体

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

オブジェクトは、データの保存専用のメモリ領域です。数値、ブール値、コードなどのさまざまなデータをオブジェクトに保存できます。オブジェクトは 3 つの部分で構成されます。

  1. オブジェクトの識別子 (id)
  2. オブジェクトのタイプ (タイプ)
  3. オブジェクトの価値

オブジェクト指向 (OOP)

Python はオブジェクト指向プログラミング言語です。いわゆるオブジェクト指向言語は、言語内のすべての操作がオブジェクトを通じて実行されることを単に理解しています。

手続き型プログラミング言語

プロセス指向とは、プログラムのロジックを1つずつステップに分解し、各ステップを抽象化することでプログラムを完成させることを指します。たとえば、子供が学校に通うプロセスは、次のような複数のステップに分けることができます。

  1. お母さんは起きます
  2. お母さんはトイレに行きます
  3. お母さんが洗濯する
  4. お母さんが朝食を作る
  5. 母親が子供を起こす
  6. 子供がトイレに行く
  7. 子供は洗う必要がある
  8. 子供たちが食べる
  9. ランドセルを背負って学校へ行く子供

プロセス指向プログラミングの考え方は、機能を小さなステップに分解し、それぞれの小さなステップを完了することでプログラムを完成させます。このプログラミング方法は比較的シンプルで人間の思考に沿ったものです。しかし、再利用性が低く、メンテナンスも困難です。

オブジェクト指向プログラミング言語

オブジェクト指向プログラミング言語は、プロセスではなくオブジェクトに焦点を当てます。オブジェクト指向言語では、すべてがオブジェクトです。たとえば、子供の母親が起きて子供に学校に行くように電話をかけます。

オブジェクト指向プログラミングの考え方は、すべての関数を対応するオブジェクトに均一に保存するため、特定の関数を使用するには、対応するオブジェクトを直接検索するだけです。この方法で記述されたコードは、読みやすく、保守しやすく、再利用しやすいです。ただし、この方法は書くのが少し面倒で、従来の考え方に準拠していません。

要約すると、オブジェクト指向プログラミングの考え方には主に 2 つのステップが含まれます。

  1. パートナーを見つける
  2. オブジェクトに関与する

クラス

Python では、組み込みオブジェクト (int、float、str など) を使用してオブジェクトを作成できます。ただし、すべてのニーズを満たすことはできないため、多くの場合、一部のオブジェクトをカスタマイズする必要があります。簡単に言えば、クラスは図面に相当します。プログラム内のクラスに基づいてオブジェクトを作成する必要があります。オブジェクトはクラスのインスタンスであると言う人もいます。クラスを通じて複数のオブジェクトが作成される場合、 int()、float()、bool()、str()、list()、dict() のようなオブジェクトと同様に、これらのオブジェクトをオブジェクトのクラスと呼びます。独自のクラスを定義する場合は、大文字で始め、キャメルケース (パスカル表記) を使用してクラス名を付ける必要があります。

#定义一个简单的类
class MyClass():
    pass

mc = MyClass()

クラスを使用してオブジェクトを作成するプロセス

関数を呼び出すのと同じように、クラスを使用してオブジェクトを作成します。そのプロセスは次のとおりです。

1.変数を作成する

2. メモリ内に新しいオブジェクトを作成します

3. オブジェクトの ID を変数に割り当てます

クラス定義

実際、クラスとオブジェクトは、現実世界の物事やプログラムのコンテンツから抽象化されたものです。クラスのコード ブロック内で変数と関数を定義できます。変数はクラス インスタンスのパブリック プロパティになり、クラスのすべてのインスタンスに object.property 名の形式でアクセスできます。関数はクラス インスタンスのパブリック メソッドになり、クラスのすべてのインスタンスが object.methodname() の形式でメソッドを呼び出すことができます。メソッドを定義するときは、少なくとも 1 つの仮パラメータを定義する必要があります。メソッドが呼び出されるとき、パーサーはまず現在のオブジェクト内で属性またはメソッドを探します。そうでない場合は、現在のオブジェクトのクラス オブジェクト内で探します。それでもクラス オブジェクトがない場合は、エラーが報告されます。

#定义一个简单的人类
class Person :
    name = 'swk' # 公共属性,所有实例都可以访问

    def say_hello(self) :
        print('你好!我是 %s' %self.name)
        
p1 = Person()
p2 = Person()

p1.name = '猪八戒'

p1.say_hello() # '你好!我是 猪八戒'
p2.say_hello() # '你好!我是 swk'

コードデモ

#定义一个简单的类
class MyClass():
    pass

#使用MyClass创建一个对象
mc = MyClass() # mc就是通过MyClass创建的对象,mc是MyClass的实例
mc_2 = MyClass()
mc_3 = MyClass()
mc_4 = MyClass()

# isinstance()用来检查一个对象是否是一个类的实例
result = isinstance(mc_2,MyClass)

#现在我们通过MyClass这个类创建的对象都是一个空对象
#也就是对象中实际上什么都没有,就相当于是一个空的盒子
#可以向对象中添加变量,对象中的变量称为属性
#语法:对象.属性名 = 属性值
mc.name = '孙悟空'
mc_2.name = '猪八戒'

print(mc_2.name)

#定义一个简单的人类
class Person :
    name = 'swk' # 公共属性,所有实例都可以访问

    def say_hello(self) :
        print('你好!我是 %s' %self.name)
        
p1 = Person()
p2 = Person()

p1.name = '猪八戒'

p1.say_hello() # '你好!我是 猪八戒'
p2.say_hello() # '你好!我是 swk'

初期化メソッドとインスタンスのプロパティ

クラスでは、オブジェクトの作成時に自動的に呼び出される初期化メソッド ( init ) と呼ばれる特別なメソッドを定義できます。初期化メソッドはパラメータを受け入れ、これらのパラメータをオブジェクトのプロパティに割り当てることができます。このようにして、オブジェクトごとに異なる初期値を設定できます。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def say_hello(self):
        print(f"你好!我是{
      
      self.name},今年{
      
      self.age}岁。")

上記のコードでは、と のPerson2 つのインスタンス プロパティを持つクラスを定義します初期化メソッドは 2 つのパラメーターを受け入れ、それらをオブジェクトのプロパティに割り当てます。オブジェクトを作成してメソッドを呼び出すことで、これらのプロパティにアクセスして変更できます。nameagesay_hello

クラスのプロパティとクラスのメソッド

インスタンス プロパティとインスタンス メソッドに加えて、クラスにはクラス プロパティとクラス メソッドを持つこともできます。

クラス属性は、インスタンスではなくクラス自体に属する属性です。このクラスのすべてのインスタンスは、クラス プロパティにアクセスして変更できます。

class Person:
    count = 0  # 类属性

    def __init__(self, name):
        self.name = name
        Person.count += 1  # 每创建一个实例,count加1

    @classmethod
    def get_count(cls):
        return cls.count  # 使用cls访问类属性

上記のコードでは、count作成されたインスタンスの数を記録するクラス属性を定義します。インスタンスが作成されるたびに、count初期化メソッドを通じてクラス属性が 1 ずつ増加します。クラスメソッドを通じてget_count()、これまでに作成されたインスタンスの数を取得できます。

継承とポリモーフィズム

Python のクラスは継承もサポートしており、あるクラスが別のクラスからプロパティとメソッドを継承できます。サブクラスは親クラスのメソッドをオーバーライドして、多態性の効果を実現できます。

class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        print(f"{
      
      self.name}汪汪叫")

class Cat(Animal):
    def speak(self):
        print(f"{
      
      self.name}喵喵叫")

上記のコードでは、Animal1 つのメソッドを持つクラスを定義しましたspeak次に、クラスDogCat2 つのサブクラスをそれぞれ定義しましたAnimalサブクラスは親クラスのメソッドをオーバーライドできますが、これはポリモーフィズムの現れで​​す。Dogとオブジェクトを作成すると、Catそれぞれのspeakメソッドを呼び出すことができます。

魔法の方法

初期化メソッド ( init )に加えて、Python にはマジック メソッドとも呼ばれる特別なメソッドが多数あります。これらの特別なメソッドは二重アンダースコアで始まり、終わり、特定の瞬間に自動的に呼び出されます。

class Person:
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return f"Person对象:{
      
      self.name}"

    def __eq__(self, other):
        return self.name == other.name

上記のコードでは、__str__と という2 つのマジック メソッドを定義します__eq__

  • __str__オブジェクトの文字列表現を定義するために使用されるメソッド。このメソッドは、関数が呼び出されるprintか使用されるときに自動的に呼び出され、文字列表現を返します。str()
  • __eq__メソッドは、オブジェクトの同等性を定義するために使用されます。別のオブジェクトをパラメータとして受け取り、カスタム ロジックに基づいて 2 つのオブジェクトが等しいかどうかを判断します。

これらの魔法のメソッドを実装することで、オブジェクトの動作をより適切に制御し、期待との一貫性を高めることができます。

まとめ

この章では、Python クラスの基本概念と使用法を紹介しました。初期化メソッドからインスタンス プロパティ、クラス プロパティ、クラス メソッド、継承、ポリモーフィズムに至るまで、クラスのさまざまな機能と使用法を段階的に深く理解しています。同時に、クラスの動作をカスタマイズするために実装できるマジック メソッドの役割と使用法についても学びました。

クラスのカプセル化

オブジェクト指向プログラミングでは、カプセル化は重要な概念です。これは、データとメソッドを 1 つのエンティティに結合し、特定の実装の詳細を外部から隠すことを指します。

Python のクラスは、カプセル化のメカニズムを提供します。アクセス修飾子を使用して、プロパティとメソッドのアクセシビリティを制御できます。

  • パブリック アクセス修飾子: 修飾子は使用されず、すべてのプロパティとメソッドはデフォルトでパブリックになります。パブリックのプロパティとメソッドには、クラスの内部と外部の両方でアクセスできます。
  • プライベート アクセス修飾子: プライベート プロパティとメソッドを定義するには、プレフィックスとして二重アンダースコア (__) を使用します。プライベート プロパティとメソッドにはクラス内でのみアクセスでき、クラス外から直接アクセスすることはできません。
class Person:
    def __init__(self, name):
        self.__name = name  # 私有属性

    def __say_hello(self):  # 私有方法
        print(f"你好!我是{
      
      self.__name}。")

    def greet(self):
        self.__say_hello()

上記のコードでは、nameと はsay_hello両方ともプライベート メンバーです。プライベート プロパティとメソッドは、プレフィックスとして二重アンダースコアを使用して定義できます。クラス内では、これらのプライベート メンバーに直接アクセスできます。クラスの外部では、プライベート メンバーに直接アクセスすることはできませんが、パブリック メソッドを通じて間接的にアクセスできます。

プロパティのアクセサーとセッター

プロパティに直接アクセスするだけでなく、プロパティ アクセサー (ゲッター) とプロパティ セッター (セッター) を使用して、プロパティのアクセスと変更を制御することもできます。

class Person:
    def __init__(self, name):
        self.__name = name

    @property
    def name(self):  # 属性访问器
        return self.__name

    @name.setter
    def name(self, value):  # 属性设置器
        if isinstance(value, str):
            self.__name = value
        else:
            raise ValueError("姓名必须是字符串类型")

上記のコードでは、@propertyという名前のデコレータを使用してプロパティ アクセサーを定義しましたname()にアクセスすると、プライベートプロパティの値obj.nameを取得できます。__name次に、@name.setterデコレーターを使用して、 という名前のプロパティ セッターを定義しますname()assign を通じて、プライベート プロパティの値obj.name = valueを変更できます。__name

この利点は、オブジェクト プロパティを外部で使用する場合、プライベート プロパティに直接アクセスすることなく、通常のプロパティと同じようにアクセスできることです。

まとめ

この記事では、Python クラスのカプセル化と属性アクセス制御について紹介しました。アクセス修飾子、プライベート プロパティ、およびメソッドを使用すると、クラスの実装の詳細を非表示にし、外部使用のためのパブリック インターフェイスを提供できます。また、プロパティ アクセサーとセッターを使用して、プロパティへのアクセスと変更を制御する方法も学びました。

要約する

この記事では、オブジェクト、クラス、継承、ポリモーフィズム、マジック メソッドなど、オブジェクト指向プログラミングにおけるいくつかの重要な概念とテクニックを紹介します。クラスとオブジェクトを使用すると、データとメソッドを 1 つのエンティティに結合して、コードのカプセル化と再利用を実現できます。

手続き型プログラミング言語では、主にプログラムの手続きと関数に焦点が当てられます。オブジェクト指向プログラミング言語では、プログラムをオブジェクトに分解し、それぞれが独自のデータとメソッドを持ちます。この方法はより柔軟で理解しやすいです。

クラスはオブジェクトのテンプレートであり、クラスを定義することで複数のインスタンス オブジェクトを作成できます。クラスは属性とメソッドで構成され、属性はオブジェクトのデータを格納し、メソッドはオブジェクトの動作を定義します。

初期化メソッドとインスタンス プロパティは、オブジェクトの作成時にオブジェクトの状態を初期化するために使用されます。クラス属性はすべてのインスタンスによって共有されるプロパティであり、クラス メソッドは単一のインスタンスではなくクラス全体に作用するメソッドです。

継承とポリモーフィズムは、オブジェクト指向プログラミングにおける 2 つの重要な概念です。継承を通じて、新しいクラスを作成し、既存のクラスからプロパティとメソッドを継承できます。ポリモーフィズムにより、異なるオブジェクトが同じメソッドを異なる方法で実装できるようになり、コードの柔軟性とスケーラビリティが向上します。

マジック メソッドは、初期化、比較、演算子のオーバーロードなど、特定の関数や動作を実装するために使用される Python の特別に名前が付けられたメソッドです。

さらに、この記事では、クラスのカプセル化と属性のアクセス制御についても紹介します。アクセス修飾子、プライベート プロパティ、およびメソッドを使用すると、クラスの実装の詳細を非表示にし、外部使用のためのパブリック インターフェイスを提供できます。プロパティ アクセサーとセッターは、プロパティのアクセスと変更を制御し、コードのセキュリティと保守性を向上させることができます。

全体として、オブジェクト指向プログラミングは、プログラムをオブジェクトに分解することでコードのモジュール性、再利用、柔軟性を実現できる強力なプログラミング パラダイムです。クラス定義、継承、ポリモーフィズム、マジック メソッドなどの概念とテクニックをマスターし、より構造化されたスケーラブルなコードを作成できるようになります。

おすすめのPythonブティックコラム


Pythonの基礎知識(0基礎入門)

【Python基礎知識】 0.print()関数
【Python基礎知識】 1.データ型、データ応用、データ変換
【Python基礎知識】 2.if条件判定と条件ネスト
【Python基礎知識】 3.input()関数
【Pythonの基礎知識】 4. リストと辞書
【Pythonの基礎知識】 5. Forループとwhileループ
【Pythonの基礎知識】 6. ブール値と4種類のステートメント(break、Continue、pass、else)
【Pythonの基礎知識】 7. 実践操作 ~Pythonを使って「Word PK」ゲームを実装してみる(1)
【Pythonの基礎】 7. 実践操作 ~Pythonを使って「Word PK」ゲームを実装してみる(2)
【Pythonの基礎】 8. プログラミング的思考:問題の解決方法 思考編
【Pythonの基礎知識】 9. 関数の定義と呼び出し
【Pythonの基礎知識】 10. 関数を使ったプログラムの書き方 実践編
【Pythonの基礎知識】 10. Pythonの使い方じゃんけんゲームを実装する - 関数の実践操作編
【Pythonの基礎】 11. デバッグ方法 - よくあるエラー原因とトラブルシューティングの考え方 - 考え方の章
【Pythonの基礎】 12. クラスとオブジェクト(1)
【Pythonの基礎】 12 . クラスとオブジェクト (2)
【Pythonの基礎知識】 13. クラスとオブジェクト (3)
【Pythonの基礎知識】 13. クラスとオブジェクト (4)
【Pythonの基礎知識】 14. ライブラリ管理システムの構築(実践)クラスやオブジェクトの操作)
【Pythonの基礎知識】 15. コーディングの基礎知識
【Pythonの基礎知識】 16. ファイルの読み書きと操作の基礎
【Pythonの基礎知識】 16. 「古詩書き取り問題」のPython実装(ファイルの読み書きとコーディング~実践操作)
【Pythonの基礎知識】 17. モジュールの概念と導入方法
【Python基礎】 18. 実践的な運用~Pythonを使って大量メール自動送信~
【Python基礎】 19. プロダクトの考え方とフローチャートの使い方~考え方
【Python基礎】 20. Pythonの実装「お昼何を食べるか」の(プロダクト思考~実践運用編)
【Pythonの基礎知識】 21. 効率よくダラダラ開く正しい開き方~卒業
【Python ファイル処理】 CSV ファイルの読み込み・加工・書き込み
【Python ファイル処理】 】Excel自動処理(openpyxlを使用)
【Pythonファイル処理】 - Excel形式処理


Python クローラーの知識

【python クローラー】 1. クローラーの基礎知識
【python クローラー】 2. Web ページの基礎知識
【python クローラー】 3. クローラー初体験(BeautifulSoup 解析)
【python クローラー】 4. クローラーの実践操作(ディッシュクローリング)
【pythonクローラー】 5 .クローラーの実践操作(歌詞のクローリング)
【Python クローラー】 6. クローラーの実践操作(パラメーター付きデータのリクエスト)
【Python クローラー】 7. クロールされたデータはどこに保存されるの?
[Python クローラー] 8. 過去を振り返り、新しいことを学ぶ
[Python クローラー] 9. Cookie (クッキー) でログインする
[Python クローラー] 10. ブラウザーに自動で動作するよう指示する (Selenium)
[Python クローラー] 11. クローラーに任せる時間通りに報告する
[Python クローラー] 12. クローラー軍団を構築する
[Python クローラー] 13. 太らない食事とは (クローラー実習)
[Python クローラー] 14. Scrapy フレームワークの説明
[Python クローラー] 15. Scrapy フレームワークの実践(人気のジョブクローリング Take)
【Python クローラー】 16. クローラーの知識ポイントのまとめと復習

おすすめ

転載: blog.csdn.net/qq_41308872/article/details/132848250