__init__方法セクション8.3 Pythonのクラスの深さ分析:詳細な構成方法と継承

クリエイティブコモンズライセンス 著作権:帰属、紙ベースを作成するために他人を許可し、(同じライセンスで元のライセンス契約に基づいて用紙配布する必要がありますクリエイティブコモンズ

最初の8.3 Pythonのクラスの__init__メソッド分析-depth:詳細な構成方法と継承

 

I.はじめ
2上には、最初に実行Pythonクラスのインスタンスを作成し、クラスにはコンストラクタメソッドをオーバーライドしていない場合、Pythonはデフォルトの__init_を与える説明施工方法を説明する方法であり、構文と引数のコンストラクタを記述します_方法。上記の説明は、カスタムクラスが別のカスタムクラスから派生した場合、親クラスから状況を定義していないカスタムクラスに適用され、何が起こるのだろうか?
第二に、コンストラクタと継承
サブクラス内の関連する論理的正しさを保護するためには、コンストラクタをオーバーライドするには、スーパークラス(継承されたクラス)のコンストラクタを呼び出す必要があります、またはそれは、オブジェクトを初期化し、適切ではないかもしれません。
1.処理のための施工方法でサブクラス、二つの方法がある:
1>継承されたコンストラクタをオーバーライドしないが、この時間は直接サブクラスは親クラスのコンストラクタを継承し;
2>親クラスのコンストラクタをオーバーライドし、サブ明示的に実行される特定のコードの場所を必要とせずに、親クラスのコンストラクタを呼び出すと、中間部または端部があってもよい主にビジネス・ロジックを確認するために、サブクラスのコンストラクタの開始時とすることができるクラスのコンストラクタは、必要はありません。
どちらの方法は、サブクラスの正しさは、親クラスのコンストラクタを継承することを確認します。

2.サブクラスは三つの方法のコンストラクタ呼び出しの親クラス表示する
親クラスのコンストラクタのため1>親クラス名を、この方法は、自己のパラメータは、親クラスのメソッドに渡す必要があり、注意が必要です;.
。2>スーパー()親クラスのコンストラクタが自動的にパイソンから輸入し、この方法は、自己の引数が渡すことはできません必要はありません呼び出します。
(自己、サブクラス名).. 3>スーパー親クラスのコンストラクタは、この方法は、自己のパラメータを渡す必要はありません呼び出します。
上記の3つの方法、古い猿は親クラスまたはサブクラス場合、1は使用が簡単で、親クラスの名前またはサブクラス名を与える必要があり、自己のパラメータの受け渡しを必要としない、第二は、簡単なプログラムの修正ではありません、第二の使用をお勧めしますコードを変更せずに変更に名前を付けます。しかし、この方法では、唯一のpython3後にサポートされています。

第三に、ケース
1ケース注:
このセクションでは、継承のケースを使用して、スーパークラスは、車両(車両)、サブクラス車(自動車)、車3つだけのインスタンス変数である:wheelcount(車輪の数)、電力(パワー)さまざまな状況に応じて総走行距離totaldistance、サブカテゴリは、異なるインスタンス変数、キロoilcostperkm(割り当ては百キロの割り当てに基づいている場合、バック、エラーを使用する場合、それが注目される)当たりの燃料消費量を増加させるために、インスタンス変数アップを持っています。問題は、コンストラクタの定義だけを集中させるためには、クラスのスーパーでのクラス定義は次のように:

class Vehicle():
   def __init__(self,wheelcount, power):
       self.wheelcount,self.power,self.totaldistance = wheelcount,power,0

2.ケース1:構成の方法は、サブクラスでオーバーライドしない
次のようにサブクラスが定義されている)1:

class Car(Vehicle):pass

この時点では、親クラスのコンストラクタを継承する必要があります。
2)いいえ書き込みコンストラクタはパラメータ定義されていないインスタンスで実行され、システムが与えられなければなりません

car=Car()

3)の要件は、親クラスのインスタンスによって定義されます

car=Car(4,'汽油发动机') #带正确参数执行

4)ケースのスクリーンショット:


 
5)まとめ:
サブクラスは、親クラスのコンストラクタを継承定義された直接実行のインスタンスコンストラクタを行います。

3.ケース2:サブクラスコンストラクタサブクラスコンストラクタ親クラスのコンストラクタを呼び出すことなくオーバーライド
次のように1)サブクラスが定義されます。

class Car(Vehicle):  #子类重写构造方法但子类构造方法中不调用父类构造方法
    def __init__(self,wheelcount, power,oilcostperkm):
        self.oilcostperkm = oilcostperkm
        print("In Car __init__:oilcostperkm=",self.oilcostperkm)。

2)インスタンスを定義

car=Car(4,'汽油发动机',10)

3)データビューの例を

car.__dict__ #查看实例自定义属性,应该只有oilcostperkm
car.wheelcount #查看实例的    wheelcount,应报错

4)ケースのスクリーンショット:


 
5)概要:
あなたは親クラスのコンストラクタを呼び出す場合、サブクラスは、コンストラクタをオーバーライドするが表示されていないので、親クラスのコンストラクタの関連するコードを実行されません。

4.ケース3:サブクラスが、コンストラクタをオーバーライドし、親クラスのコンストラクタを呼び出す
1)を以下のようにサブクラスが定義されています。

class Car(Vehicle):  #子类重写构造方法但子类构造方法中不调用父类构造方法
    def __init__(self,wheelcount, power,oilcostperkm):
        self.oilcostperkm = oilcostperkm
        print("In Car __init__:oilcostperkm=",self.oilcostperkm)
        super().__init__(wheelcount, power) 

これは古い猿好ましいメソッドの呼び出しは、本実施形態で使用されるコンストラクタコール親クラス、方法はさらに、以下の二つを呼び出すことができます。

Vehicle.__init__(self,wheelcount, power)
super(Car,self).__init__(wheelcount, power)

2)インスタンス・ビュー・データを定義し、

car=Car(4,'汽油发动机',10) #应该执行两个构造方法
car.__dict__ #查看实例自定义属性,应该wheelcount, power,oilcostperkm都有
car.wheelcount #查看实例的    wheelcount,应正常给出

3)ケーススクリーンショット:


 
4)まとめ:サブクラスがコンストラクタをオーバーライドし、ディスプレイは、親クラスのコンストラクタを呼び出し、インスタンス変数が正しく初期化に関連します。

このセクションでは、連続して例の組み合わせを詳述サブクラスのコンストラクタは、コンテンツは比較的単純だが非常に重要であり、注意してくださいどのように認識すべきです。
Pythonプログラマとは接触を助けていない古い猿の学習Pythonの学習経験の漸進的な導入のための要約記事の旧猿のPython(https://blog.csdn.net/LaoYuanPython)シリーズは、簡単にはPythonを入力することができます世界。
批判を歓迎し、あなたの注意をありがとう!

 

おすすめ

転載: blog.csdn.net/LaoYuanPython/article/details/93513097