initはその理由の二つの主要な()メソッドセンスを持っています。第一の理由は、オブジェクトのライフサイクルを初期化することで、最も重要なステップであり、各オブジェクトが正しく動作するために、適切に初期化する必要があります後。第2の理由はあるのinit()パラメータの値は、多くの形態をとることができます。
__init__メソッド
1.デモを使用して
初期化。名前の開始と終了は、二重下線を付していることに注意してください。
使用__init__メソッド
コード例を
#は/ usr / binに/ Pythonの! #ファイル名:class_init.py クラスPerson: デフ__init __(自己、名): self.name =名 sayHi(自己)DEF: self.nameの、私の名前は、こんにちは、印刷 P =人( Swaroop) p.sayHi() この短い例は、また人(Swaroop).sayHi()のように書くことができる#
輸出
$パイソンclass_init.py こんにちは、私の名前はSwaroopです
それはしくみ
ここでは、パラメータ名(と、共通のパラメータ自己を)取るよう__init__メソッドを定義します。この__init__では、私たちはまた、名前と呼ばれる新しいフィールドを作成します。彼らは同じ名前を持っているにもかかわらず、彼らは二つの異なる変数であることに注意してください。いいえポイントは、私たちはそれらを区別することができません。
最も重要なことは、我々は、特にこのように、括弧内の__init__メソッドに渡されたパラメータは、バックにクラス名を含む場合、単にクラスの新しいインスタンスを作成し、__init__メソッドを呼び出していませんでしたされています。これは、このアプローチの重要なポイントです。
今、我々は我々のアプローチでself.nameドメインを使用することができます。これは、sayHiプロセスを確認されています。
__init__方法は、コンストラクタでC、C#やJavaに類似しています
2.注意点
注1、__ init__は、C#でコンストラクタと等価ではない、それは実行する時が来た、例が構築されてきました。
クラスA(オブジェクト): デフ__init __(自己、名): self.name =名前 のgetName(自己)DEF: リターン'' + self.name
我々は実行すると、
= A( 'こんにちは')
とき、それは次のように理解することができます
=オブジェクト.__新しい__(A) A .__のinit __( 'こんにちは')
__init__すなわち、初期化関数の後には、インスタンス化されたオブジェクトです。
注2、サブクラスは__init__、インスタンスのサブクラスをオーバーライドすることはできません、自動的に定義されたスーパークラスの__init__を呼び出します。
クラスB(A): DEFのgetName(自己): 戻り'B '+ self.name 場合__name __ ==' __ MAIN__': B = B( 'ハロー') 印刷b.getName()
しかし、書き換え__init__、インスタンスのサブクラスならば、それはスーパークラスが定義されている__init__暗黙の呼び出しを行くことはありません
クラスC(A): デフ__init __(自己): 渡す デフのgetName(自己): 戻り'C '+ self.name 場合__name __ ==' __ MAIN__': C = C() (c.getNameを印刷する)を
エラー:「『C』オブジェクトは、属性 『名前』を持っていないはAttributeErrorは」ので、あなたは__init__をオーバーライドする場合は、使用したり、スーパークラスの動作を拡張するために、最高のは、明示的にスーパークラスの__init__を呼び出すことが報告されます。方法
クラスC(A): デフ__init __(自己、名): スーパー(C、自己).__のinit __(名) デフのgetName(自己): リターン'C '+ self.name 場合__name __ ==' __ MAIN__': C = C ( 'こんにちは') )(c.getName を印刷
参考リンクします。https://www.cnblogs.com/insane-Mr-Li/p/9758776.html