標籤:blog color 使用 os io strong ar cti
注意1、__init__並不相當於C#中的建構函式,執行它的時候,執行個體已構造出來了。
12345 |
class A( object ): def __init__( self ,name): self .name = name def getName( self ): return ‘A ‘ + self .name |
當我們執行
時,可以理解為
12 |
a = object .__new__(A) A.__init__(a, ‘hello‘ ) |
即__init__作用是初始化已執行個體化後的對象。
注意2、子類可以不重寫__init__,執行個體化子類時,會自動調用超類中已定義的__init__
1234567 |
class B(A): def getName( self ): return ‘B ‘ + self .name if __name__ = = ‘__main__‘ : b = B( ‘hello‘ ) print b.getName() |
但如果重寫了__init__,執行個體化子類時,則不會隱式的再去調用超類中已定義的__init__
123456789 |
class C(A): def __init__( self ): pass def getName( self ): return ‘C ‘ + self .name if __name__ = = ‘__main__‘ : c = C() print c.getName() |
則會報"AttributeError: ‘C‘ object has no attribute ‘name‘”錯誤,所以如果重寫了__init__,為了能使用或擴充超類中的行為,最好顯式的調用超類的__init__方法
123456789 |
class C(A): def __init__( self ,name): super (C, self ).__init__(name) def getName( self ): return ‘C ‘ + self .name if __name__ = = ‘__main__‘ : c = C( ‘hello‘ ) print c.getName() |