Python中_uinit_方法の注意点

3161 ワード

原文の住所:http://www.cnblogs.com/zyxstar2003/archive/2011/03/21/1989954.html
気をつけますinit_C〓〓の中の構造関数に相当しないで、そのを実行する時、実例はすでに構造しました。
1
2
3
4
5class A(object):    def__init__(self,name):        self.name=name    defgetName(self):        return'A '+self.name私たちが実行する時
1a=A('hello')にあたっては
1
2a=object.__new__(A)A.__init__(a,'hello')すなわち_うinit_は、実用化されたオブジェクトを初期化します。
注意2、子類は書き換えなくてもいいです。init_,インスタンス化子クラスの場合、スーパークラスで定義されている_u_u uを自動的に呼び出します。init_
1
2
3
4
5
6
7class B(A):    defgetName(self):        return'B '+self.name  if __name__=='__main__':    b=B('hello')    printb.getName()でも書き直したら_u u u u uinit_,インスタンス化子クラスの場合、メタクラスで定義されているガイガイを暗黙的に呼び出しません。init_
1
2
3
4
5
6
7
8
9class C(A):    def__init__(self):        pass    defgetName(self):        return'C '+self.name  if __name__=='__main__':    c=C()    printc.getName()「AttributeError:'C'object hasのatribute'name'というエラーがありますので、_init__を書き直したら、超種類の中の行為を使用したり、拡張するために、超種類の__init_メソッドを明示的に呼び出したほうがいいです。
1
2
3
4
5
6
7
8
9class C(A):    def__init__(self,name):        super(C,self).__init__(name)    defgetName(self):        return'C '+self.name  if __name__=='__main__':    c=C('hello')        printc.getName()