Python - オブジェクト指向

(1) オブジェクト指向を知る

      Python はオブジェクト指向の考え方を完全に採用しており、本物のオブジェクト指向プログラミング言語であり、継承、ポリモーフィズム、カプセル化などのオブジェクト指向の基本機能を完全にサポートしています。 Python は、 プロセス指向、オブジェクト指向、関数型プログラミングなどの複数のプログラミング パラダイム。
   Pythonでは 、すべてがオブジェクトです。先ほど学習したデータ型や関数などはすべてオブジェクトです。
オブジェクト指向の機能 
   オブジェクト指向プログラミング ( オブジェクト指向プログラミング OOP ) の考え方は、主に大規模ソフトウェア向けに設計されています。
   オブジェクト指向プログラミングにより、プログラムの拡張性と読みやすさが向上し、プログラミングがブロックを構成するのと同じくらい簡単になります。
    オブジェクト指向プログラミングは、データやデータの操作に関わるメソッドをオブジェクトにカプセル化し、コードやデータの組み立て方が人間の思考に近いため、プログラミングの効率が大幅に向上します。
手続き型とオブジェクト指向の違い
       プロセス指向とオブジェクト指向はどちらもソフトウェアの分析、設計、開発の考え方であり 人々がさまざまな方法でソフトウェアを分析、設計、開発できるように導きます。C 言語は代表的なプロセス指向言語であり、Javaは 代表的なオブジェクト指向言語です。
プロセス指向とは何ですか?
プロセス指向は、実行方法に焦点を当てた、単純で非協力的なトランザクションに適しています。プロセス指向の場合、まず「 どのように段階的に実装するか」を考えます。たとえば、どうやって運転するのですか?実装手順は簡単にリストできます。
しかし、 「 車をどのように作るか? など、より複雑な設計タスクについて考えると、そのようなステップを 1234 個 も列挙することは不可能であることがわかります。それは、自動車の製造があまりにも複雑で、完成させるには多くの協力が必要だからです。このとき、オブジェクト指向の考え方が生まれました。

オブジェクト指向とは何ですか?
     オブジェクト指向 (オブジェクト指向) の考え方は、人々の思考モードにより一致しています。私たちが最初に考えるのは、「 これをどうデザインするか? 」ということです たとえば、車を作ろうと考えるとき、 「 車を段階的に作る 方法」 ではなく、 「車をどのように設計するか を最初に考えますこれは考え方の変化です。当然、私たちは「車は何でできているのか」ということを考え始めます。車: ボディ、エンジン、アクセル、ハンドル...
   協力するために、タイヤの製造工程を完結するタイヤ工場と、エンジンの製造工程を完結するエンジン工場を設立し、全員が同時に車を製造し、最終的に組み立てることができることを発見しました。 、効率が大幅に向上します。タイヤ工場の組立ライン作業に特有のステップがあり、依然として実行者と切り離すことができず、プロセス指向です。
        オブジェクト指向は、システム全体をマクロな視点から把握し、分析するのに役立ちます。ただし、実装部分 (つまり、各メソッド) のマイクロ操作に関しては、依然としてプロセス指向の方法で処理する必要があります。
オブジェクト指向とプロセス指向のまとめ
1
どちらも問題解決の考え方であり、コードを整理する方法でもあります。
2
プロセス指向は一種の 実行者の思考 」です 。単純な問題を解決するにはプロセス指向を使用できます。
3
オブジェクト指向は一種の デザイナーの思考 」です 。複雑で協調的な問題を解決するには、オブジェクト指向を使用できます。
オブジェクト指向はプロセス指向から切り離すことはできません。
巨視的に: オブジェクト指向による全体設計
マイクロ: データの実行と処理、依然としてプロセス指向

(2) 対象

 
プログラミングが直面する問題がますます複雑になるにつれて、プログラミング言語自体も進化しており、主に単純なデータを処理することから始まり、データの増加に応じて「配列     が進化し、データ型がより複雑になり、データを処理する「構造体 が進化しています。手法やロジックは複雑化し、 「もの」は進化する。
    単純なデータ
30 、 40 50.4など        の数値は 単純なデータとみなすことができます。まさに最初のコンピューター プログラムはこのような数字でプログラムされていました。
2
   C言語の配列
     同じ種類のデータをグループ化します。例: 整数配列 [20,30,40] 、浮動小数点配列 [10.2, 11.3, 12.4] 、文字列配列: ["aa", "bb", "cc"] 、上記 [ 20,30,40 ] Pythonではリストですが、 Cでは配列です
3
   C言語の構造体
 さまざまな種類のデータをまとめるのが C言語 のデータ構造です。例えば:
struct resume{
    int age;
    char name[10];
    double value;
};

4

   物体
さまざまな種類のデータとメソッド (つまり、関数) をまとめたものがオブジェクトです。例えば:
class Student:
    company = "SXT"     #类属性
    count = 0           #类属性

    def __init__(self,name,score):
        self.name = name         #实例属性
        self.score = score
        Student.count = Student.count+1
    def say_score(self):           #实例方法
        print("我的公司是:",Student.company)
        print(self.name,'的分数是:',self.score)

オブジェクトの完全なメモリ構造

      クラスは抽象クラスであり、 オブジェクト テンプレート 」とも呼ばれます クラスのテンプレートを使用してクラスのインスタンス オブジェクトを作成する必要があります。そうすれば、クラスによって定義された関数を使用できるようになります。Pythonオブジェクトには、 id ( ID識別コード)、type (オブジェクトの種類)、value (オブジェクトの値) の 3 つの部分が含まれていると前述しました。 さらに一歩進んで、Pythonオブジェクトは次の部分で構成されていると言えます。

(3)クラス定義

     クラスはテンプレートまたは図面とみなすことができ、システムはクラスの定義に従ってオブジェクトを作成します。車を作りたいのですが、どうやって作るのですか? この図面がクラスであり、車の詳細情報を指定し、その図面に従って車が作られます。
クラス: これをクラス と       呼びます オブジェクト:オブジェクト インスタンス ( インスタンス ) と呼びます 将来、あるクラスのオブジェクトは、あるクラスのインスタンスになります。それは同じことを意味します。

プロパティとメソッド

     データ型のプロパティ (データ) とメソッド (動作) はクラスを通じて定義します つまり、「 クラスは動作と状態をまとめてパッケージ化します

       オブジェクトはクラスの具体的なエンティティであり、一般に クラスのインスタンス 」と呼ばれます クラスを「 ビスケット型 とみなし、オブジェクトはこの「 に従って 製造されたビスケット」です
       オブジェクトがクラスから作成される場合、各オブジェクトはクラスの動作 (クラス内で定義されたメソッド) を共有しますが、独自のプロパティ値を持ちます (共有状態はありません)。より具体的に言うと、「 メソッド コードは共有されますが、プロパティ データは共有されません」
   学生クラスを例に挙げてみましょう

 Pythonでは すべてがオブジェクト 」です クラスは クラス オブジェクト 」とも呼ばれ 、クラスのインスタンスは「 インスタンス オブジェクト 」とも呼ばれます

クラスを定義するための構文は次のとおりです。
クラス   クラス名:
        クラス本体
主なポイントは次のとおりです。
  •   クラス名は「識別子」の規則に従う必要があります。通常、最初の文字は大文字で、複数の単語にはキャメルケース原則」が使用されます

  •   クラス本体ではプロパティとメソッドを定義できます

  • 属性はデータを記述するために使用され、メソッド (つまり、関数)はこれらのデータに関連する操作を記述するために使用されます。

典型的なクラス定義は次のとおりです。

 class Student:
     def __init__(self,name,score): #构造方法第一个参数必须为self
          self.name = name   #实例属性
          self.score = score
     def say_score(self):  #实例方法
          print("{0}的分数是{1}".format(self.name,self.score))
          s1 = Student('王老五',80) #s1是实例对象,自动调用__init__()方法
          s1.say_score()

    pass は空のステートメントです。それは何もせず、ただプレースホルダーとして存在することを意味します。コードを記述するときに、メソッドまたはクラスに何を追加すればよいかわからない場合は、最初に pass を使用してスペースを埋め、後で追加することができます。

__init__コンストラクターと__new__メソッド

    オブジェクトを初期化するには、コンストラクター __init__() メソッドを定義する必要があります。構築メソッドは、「 インスタンス オブジェクトの初期化作業 」を実行する ために使用されます。つまり、オブジェクトの作成後、現在のオブジェクトの関連プロパティが初期化され、戻り値はありません。
__init__()の主なポイントは 次のとおりです。
  •  名前は固定されており、__init__()である必要があります。

  •  最初のパラメータは固定であり、selfである必要があります self は作成したばかりのインスタンス オブジェクトを参照します

  • コンストラクターは通常、インスタンス オブジェクトのインスタンス属性を初期化するために使用されます。次のコードは、インスタンス属性を初期化するものです: namecore

    def __init__(self,name,score):
            self.name = name         #实例属性
            self.score = score
  • クラス名 ( 引数リスト )」で コンストラクタを呼び出します。呼び出し後、作成したオブジェクトを対応する変数に返します。
  • __init__() メソッド: 作成されたオブジェクトを初期化します。初期化とは、 インスタンス属性に値を割り当てる」ことを指します。
  • __new__() メソッド : オブジェクトの作成に使用されますが、通常はこのメソッドを再定義する必要はありません
  • __init__メソッド を定義しない場合 、システムはデフォルトの __init__ メソッドを提供します。
    __init__メソッドを parameters で定義すると 、システムはデフォルトの __init__ メソッドを作成しません。
        Python self は、 C++self ポインターJAVAおよびC#thisキーワード に相当します Pythonではself はコンストラクターの最初のパラメーターである必要があり、名前は任意に変更できます。しかし、一般的な実践は自己と呼ばれます。

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

インスタンス属性
インスタンス属性は、インスタンス オブジェクトに属する属性であり、 「 インスタンス変数 とも呼ばれます 彼の使い方には次の重要なポイントがあります。
 
インスタンス属性は通常、 __init__()メソッド の次のコードによって定義されます
self.インスタンス属性名 = 初期値 
このクラスの他のインスタンス メソッドでは、 selfを通じて アクセスすることもできます。
self.Instance 属性名
3
インスタンス オブジェクトを作成した後、インスタンス オブジェクトを通じてアクセスします。
obj01 = クラス名 () # オブジェクトを作成して初期化し、 __init__()を呼び出して 属性を初期化します
obj01.インスタンス属性名 = 値 # 既存の属性に値を割り当てることも、新しい属性を追加することもできます
class Student:
    def __init__(self,name,score):
        self.name = name #增加name属性
        self.score = score #增加score属性
    def say_score(self):
        self.age = 18     #增加age属性
        print("{0}的分数是{1}".format(self.name,self.score))
s1 = Student("张三",80)
s1.say_score()
print(s1.age)
s1.salary = 3000 #s1对象增加salary属性
s2 = Student("李四",90)
s2.say_score()
print(s2.age)

インスタンスメソッド
インスタンス メソッドは、インスタンス オブジェクトに属するメソッドです。インスタンスメソッドの定義形式は以下のとおりです。
def   メソッド名 ( self [, パラメータリスト ]) :
        関数本体
メソッドの呼び出し形式は次​​のとおりです。
オブジェクト.メソッド名([引数リスト])
要点:
  インスタンス メソッドを定義する場合、最初のパラメータは selfである必要があります 前と同様に、 self は 現在のインスタンス オブジェクトを参照します。
  インスタンス メソッドを呼び出す場合、パラメータを selfに渡す 必要はなく、渡すこともできません。self はインタプリタによって自動的に渡されます
関数とメソッドの違い
   これらはすべて、関数を完了するために使用されるステートメント ブロックであり、本質的には同じです。
   メソッドが呼び出されるときは、オブジェクトを通じて呼び出されます。メソッドは特定のインスタンス オブジェクトに属し、通常の関数にはこの機能がありません
   直感的には、メソッド定義では selfを渡す必要があります が、関数ではその必要はありません。
インスタンスオブジェクトのメソッド呼び出しの本質

その他の操作
dir(obj) は オブジェクトのすべてのプロパティとメソッドを取得できます
1
obj.__dict__ オブジェクトの属性辞書
2
空のステートメントを渡す
3
isinstance (object, type) は、 object 」が指定された type であるかどうか を判断します。

(4)クラスオブジェクト、クラス属性、クラスメソッド、静的メソッド

クラスオブジェクト

    先ほど説明したクラス定義形式では、 クラス クラス名: 実際、インタプリタが クラス ステートメントを実行すると、クラス オブジェクトが作成されます。
    具体的なコード:
class Student:
    pass  #空语句
print(type(Student))
print(id(Student))

Stu2 = Student
s1 = Stu2()
print(s1)

具体的な効果:

図からわかるように、実際にはクラス名Student を変数名とする オブジェクト       が生成されます。新しい変数 Stu2に値を割り当てることで、 関連する呼び出しを実装することもできます。 「クラス オブジェクト が実際に作成されることに注意してください

クラス属性

クラス属性は、 「 クラス オブジェクト     に属する属性であり、 クラス変数 とも呼ばれます クラス属性はクラス オブジェクトに属しており、すべてのインスタンス オブジェクトで共有できるためです。
クラス属性の定義方法:
クラス   クラス名:
        クラス変数名 = 初期値
クラス内またはクラス外で、 クラス名、クラス変数名を通じて 読み取りと書き込みを行うことができます。

メモリ解析インスタンスオブジェクトとクラスオブジェクト作成処理

作成プロセス全体を分析するための例として、次のコードを取り上げます。
class Student:
     company = "仁和堂"  # 类属性
     count = 0 # 类属性
     def __init__(self, name, score):
          self.name = name  # 实例属性
          self.score = score
          Student.count = Student.count + 1

     def say_score(self):  # 实例方法
          print("我的公司是:", Student.company)
          print(self.name, '的分数是:',self.score)

s1 = Student('李白', 80)  # s1是实例对象,自动调用__init__()方法
s2 = Student('张三', 70)
s1.say_score()
print('一共创建{0}个Student对象'.format(Student.count))

クラスメソッド

クラスメソッドは「 クラスオブジェクト   に属するメソッドです クラス メソッドは、デコレータ @classmethodによって 次の形式で定義されます。
 
@クラスメソッド
def   クラスのメソッド名 ( cls [ , パラメーター リスト ]) :
メソッド本体
主なポイントは次のとおりです。
@classmethod は メソッドの上の行になければなりません
  最初の clsには必ず次の ものが必要です。cls クラス オブジェクト自体 を参照します。
クラスメソッド呼び出しの形式: クラス名.クラスメソッド名(パラメータリスト) . パラメータリストでは、 値を clsに渡す必要はなく、渡すこともできません。
クラスメソッド内のインスタンスプロパティとインスタンスメソッドにアクセスするとエラーが発生する
サブクラスが親クラスのメソッドを継承する場合、受信する cls は 親クラス オブジェクトではなくサブクラス オブジェクトになります。 
具体的なコード:
class Student:
    company = "SXT"     #类属性
    
    @classmethod
    def printCompany(cls):
        print(cls.company)
    
Student.printCompany()

 
静的メソッド
       Python では、 静的メソッド」と呼ばれる、 クラス オブジェクト」とは関係のないメソッドを 定義できます 「静的メソッド」は、 クラス名前空間」に配置れ、 クラスを介して呼び出す必要があることを除いて、モジュール内で通常の関数を定義することと何ら変わりません
静的メソッドは、デコレータ @staticmethodによって 次の形式で定義されます。
@静的メソッド
def   静的メソッド名 ([ パラメータリスト ]) :
        メソッド本体
主なポイントは次のとおりです。
@staticmethod は メソッドの上の行になければなりません
2 静的メソッド呼び出し形式: クラス名.静的メソッド名(パラメータリスト)
3 静的メソッドでインスタンス プロパティとインスタンス メソッドにアクセスするとエラーが発生する

具体的なコード:

class Student:
    company = "SXT"  # 类属性
    @staticmethod
    def add(a, b):  # 静态方法
        print("{0}+{1}={2}".format(a,b,(a+b)))
        return a+b
Student.add(20,30)

(5)デストラクタ( __del__ メソッド)とガベージコレクション機構

デストラクタ

     __del__()は デストラクター と呼ばれ 、オブジェクトが破棄されるときに必要な操作を実装するために使用されます。例: オブジェクトによって占有されているリソース (オープン ファイル リソース、ネットワーク接続など) を解放します。
       Python は自動ガベージ コレクションを実装しており、オブジェクトが参照されていないとき (参照カウントが 0 のとき)、 ガベージ コレクターによって __del__()が呼び出されます
del ステートメント        を使用してオブジェクトを削除することもできる ため、 __del__()が確実に呼び出されます システムは自動的に __del__ メソッドを提供します 。通常、カスタム デストラクター メソッドは必要ありません。
具体的なコード:
class Person:
     def __del__(self):
          print("销毁对象:{0}".format(self))
p1 = Person()
p2 = Person()
del p2
print("程序结束")
操作結果:
 

__call__ メソッドと呼び出し可能オブジェクト
Pythonでは、 ()を自分自身に直接適用して実行できる オブジェクトを 呼び出し可能オブジェクトと呼びます。
 
呼び出し可能なオブジェクトには、このセクションで説明するカスタム関数、 Python 組み込み関数、インスタンス オブジェクトが含まれます。
 
__call__() を定義する オブジェクトは 呼び出し可能オブジェクト 」と呼ばれます 。つまり、オブジェクトは関数のように呼び出すことができます。
 
このメソッドを使用すると、通常の関数を呼び出すのと同じように、インスタンスオブジェクトを オブジェクト名 ()」の形式で使用することができます

(6)オブジェクト指向の3大特徴

Python は、オブジェクト指向プログラミングの 3 つの主要な機能である継承、カプセル化 (隠蔽)、ポリモーフィズムをサポートするオブジェクト指向言語です。

 Ⅰ パッケージ

     オブジェクトのプロパティと実装の詳細は隠蔽され、必要なメソッドのみが外部から提供されます。 これは、「詳細」を 「カプセル化」し、 関連する呼び出しメソッド だけを外部に公開すること に相当します。 カプセル化」は、先ほど学習した「プライベート属性とプライベートメソッドによって実現されます
     Python は簡潔な構文を追求しており、厳密な構文レベルの アクセス制御文字」 は存在せず 、それを意識的に実現するのはプログラマに依存しています。

Ⅱ 相続

 
       継承は、オブジェクト指向プログラミングの 3 つの特徴の 1 つです。継承により、クラス拡張の実装が容易になります。クラスを再設計することなくコードの再利用を実現します。 継承により、サブクラスが親クラスの特性を持つことができるようになり、コードの再利用性が向上します。
      これは設計における漸進的な進化であり、元の親クラスの設計が変更されないままであれば、新しい機能を追加したり、既存のアルゴリズムを改善したりできます。
       新しいクラスが設計されたクラスを継承すると、既存のクラスの特性を直接保持するため、作業の難易度が大幅に軽減されます。既存のクラスは「 親クラスまたは基本クラス」と呼ばれ 、新しいクラスは サブクラスまたは派生クラス 」と呼ばれます
文法形式
    Python は 多重継承をサポートしており、サブクラスは複数の親クラスを継承できます。継承の構文は次のとおりです。
  クラス   サブクラス クラス名 ( 親クラス 1 [ , 親クラス 2 , ...]) :
            クラス本体
知らせ:
    クラス定義で親が指定されていない場合、デフォルトの親は オブジェクト クラスです 言い換えれば、 オブジェクトは すべてのクラスの親クラスであり、すべてのクラスに共通するいくつかのデフォルト実装を定義します。 __new__()

コンストラクターについて:
    サブクラスは __init__ を オーバーライドせず、サブクラスがインスタンス化されると、親クラスによって定義された __init__ が 自動的に呼び出されます。
    サブクラスが __init__ を書き換える場合、サブクラスをインスタンス化しても、親クラスによって定義された __init__ は呼び出されません。
    __init__ を書き換える場合は super キーワードを使用して親クラスのコンストラクターを使用するか、次の形式を使用して呼び出すことができます。
親クラス名.__init__(self, パラメータリスト)

クラスメンバーの継承とオーバーライド

メンバーの継承: サブクラスは、コンストラクターを除く親クラスのすべてのメンバーを継承します。( プライベートプロパティやプライベートメソッドも継承されます )
メソッドの書き換え: サブクラスは親クラスのメソッドを再定義できます。これにより、親クラスのメソッドがオーバーライドされます。「 オーバーライド 」とも呼ばれます。
 コード:
class Person:
     def __init__(self,name,age):
          self.name = name
          self.age = age

     def say_age(self):
          print(self.name,"的年龄是:",self.age)

     def say_name(self):
          print("我是",self.name)

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

     def say_score(self):
          print(self.name,"的分数是:",self.score)
     def say_name(self):  #重写父类的方法
          print("报告老师,我是",self.name)

s1 = Student("张三",16,85)
s1.say_score()
s1.say_name()
s1.say_age()
print(Student.mro())
クラスの継承階層を表示する
    このクラスの継承階層は、クラスのメソッド mro() またはクラスの属性 __mro__を通じて 出力できます。

オブジェクトルートクラス

      オブジェクト クラスはすべてのクラスの親クラスであるため、すべてのクラスは オブジェクト クラスのプロパティとメソッドを持ちます。 明らかに、オブジェクトクラスの構造 を詳しく調べる必要があります Python をさらに深く学習し続けることは、私たちにとって非常に良いことです

dir() オブジェクトのプロパティを表示する
オブジェクトについてさらに学ぶには、まず組み込み関数 dir()を学びます 。これにより、指定されたオブジェクトのすべてのプロパティを簡単に確認できるようになります。
[テスト] オブジェクトのすべてのプロパティを表示し、 オブジェクトと 比較します
具体的なコード:
class Student(Person):
     def __init__(self,name,age,score):
          Person.__init__(self,name,age)
          self.score = score

     def say_score(self):
          print(self.name,"的分数是:",self.score)
     def say_name(self):  #重写父类的方法
          print("报告老师,我是",self.name)

obj = object()
print(dir(obj))
s1 = Student("张三",15,85)
print(dir(s1))

具体的な効果:

 ['__class__'、'__delattr__'、'__dir__'、'__doc__'、'__eq__'、'__format__'、'__ge__'、'__getattribute__'、'__getstate__'、'__gt__'、'__hash__'、'__init__'、' __init_subclass__'、'__le__'、'__lt__'、'__ne__'、'__new__'、'__reduce__'、'__reduce_ex__'、'__repr__'、'__setattr__'、'__sizeof__'、'__str__'、'__subclasshook__']


['__class__', '__delattr__', '__dict__' , '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', ' __init__'、'__init_subclass__'、'__le__'、'__lt__'、'__module__'、'__ne__'、'__new__'、'__reduce__'、'__reduce_ex__'、'__repr__'、'__setattr__'、'__sizeof__'、'__str__' , '__subclasshook__', '__weakref__', 'age' , 'name' , ' say_age' , 'say_name' , 'say_score', 'score' ]

上記から、次の点がわかります。
 
Stuednt オブジェクトは 8 つのプロパティを追加します。
__dict__  、 __module__  、 __weakref__  、 年齢、 名前、 say_age、say_name、say_score、スコア
 
object のすべてのプロパティ。 objectのサブクラスとしての Student  クラスには、 明らかにすべてのプロパティが含まれています。
 
age name 、およびsay_age       を出力する と 、 say_ageはメソッドですが、実際には属性であることが わかります。 この属性のタイプがメソッドであるというだけです

多重継承

       Python は 多重継承をサポートしており、サブクラスは複数の 直接の親クラス 」を持つことができます このように「複数の親クラス という特徴があります ただし、これは「 クラス全体のレベル によって非常に複雑になるため、使用は避けてください。

具体的なコード:
class A:
     def aa(self):
          print("aa")

class B:
     def bb(self):
          print("bb")

class C(B,A):
     def cc(self):
          print("cc")
c = C()
c.cc()
c.bb()
c.aa()

super() は親クラス定義を取得します

      サブクラスで親クラスのメソッドを取得したい場合は、 super()を通じて実行できます super() は、 親クラス オブジェクトではなく、親クラスの定義を表します。
  
親クラスのコンストラクターを呼び出したい場合:
super(サブクラス名, self).__init__(パラメータリスト)
具体的なコード:
class A:
     def __init__(self):
          print("A的构造方法")

     def say(self):
          print("A: ",self)
          print("say AAA")

class B(A):
     def __init__(self):
           super(B,self).__init__() #调用父类的构造方法
           print("B的构造方法")
     def say(self):
       #A.say(self)  调用父类的say方法
          super().say()   #通过super()调用父类的方法
          print("say BBB")

b = B()
b.say()

実行結果:

A の構築メソッド
B の構築メソッド
A: <__main__.B object at 0x0000014F911A9390>
AAA と言います
BBB と言います

Ⅲ 多態性

     ポリモーフィズムとは、同じメソッド呼び出しが、オブジェクトが異なるために異なる動作を生成することを意味します。同じような生き方でも、異なる事柄に対して異なる生き方をするなど、そのような例は人生にたくさんあります。クマの命は地面を走り、魚の命は水の中を泳ぎ、ワシの命は青空にあります。ジュースを例にとると、リンゴを入れればリンゴジュース、ココナッツを入れればココナッツジュース、オレンジを入れればオレンジジュースになります。

ポリモーフィズムについては、次の 2 つの点に注意してください
  ポリモーフィズムはメソッドのポリモーフィズムですが、プロパティはポリモーフィックではありません。
  ポリモーフィズムが存在するには 、継承とメソッドの書き換えという 2 つの必要条件があります。
具体的なコード:
#多态
class Animal:
     def shout(self):
          print("动物叫了一声")

class Dog(Animal):
     def shout(self):
          print("小狗,汪汪汪")

class Cat(Animal):
     def shout(self):
          print("小猫,喵喵喵")
def animalShout(a):
     a.shout() #传入的对象不同,shout方法对应的实际行为也不同。


animalShout(Dog())
animalShout(Cat())

おすすめ

転載: blog.csdn.net/qq_63976098/article/details/131614443