一、__init__.py文件
原來在python模塊的每一個包中,都有一個__init__.py文件(這個文件定義了包的屬性和方法)然后是一些模塊文件和子目錄,假如子目錄中也有 __init__.py 那么它就是這個包的子包了。當你將一個包作為模塊導入(比如從 xml 導入 dom )的時候,實際上導入了它的 __init__.py 文件。
一個包是一個帶有特殊文件 __init__.py 的目錄。__init__.py 文件定義了包的屬性和方法。其實它可以什么也不定義;可以只是一個空文件,但是必須存在。如果 __init__.py 不存在,這個目錄就僅僅是一個目錄,而不是一個包,它就不能被導入或者包含其它的模塊和嵌套包。
在python中, module(也即python的模塊)是一個單獨的文件來實現的,要吧是py文件,或者pyc文件,甚至是C擴展的dll文件。而對於package, Python使用了文件夾來實現它,可以說,一個文件夾就是一個package,里面容納了一些py、pyc或dll文件,這種方式就是把module聚合成一個package的具體實現
發現在引入package的過程中,init.py會運行,因此,如果某些變量或方法需要常駐內存,可以將它們寫入init.py文件中。
__init__.py 中還有一個重要的變量,叫做 __all__。我們有時會使出一招“全部導入”,也就是這樣:
from PackageName import *
這時 import 就會把注冊在包 __init__.py 文件中 __all__ 列表中的子模塊和子包導入到當前作用域中來。比如:
#文件 __init__.py
__all__ = ["Module1", "Module2", "subPackage1", "subPackage2"]
二、__init__函數
父類A

1 class A(object): 2 def __init__(self, name): 3 self.name=name 4 print "name:", self.name 5 def getName(self): 6 return 'A ' + self.name
- 子類不重寫__init__,實例化子類時,會自動調用父類定義的__init__
子類B繼承父類A

1 class B(A): 2 def getName(self): 3 return 'B '+self.name 4 5 if __name__=='__main__': 6 b=B('hello') 7 print b.getName()
輸入結果為:
name: hello
B hello
2.子類重寫了__init__時,實例化子類,就不會調用父類已經定義的__init__方法
3.子類為了能使用或擴展父類的行為,最好顯示調用父類的__init__方法
class 子類:
def __init__(self,參數) :
super(子類,self).__init__(參數) #執行父類的__init__方法

1 class A(object): 2 def __init__(self, name): 3 self.name=name 4 print "name:", self.name 5 def getName(self): 6 return 'A ' + self.name 7 8 class B(A): 9 def __init__(self, name): 10 super(B, self).__init__(name) 11 print "hi" 12 self.name = name 13 def getName(self): 14 return 'B '+self.name 15 16 if __name__=='__main__': 17 b=B('hello') 18 print b.getName()
輸出結果:
name: hello
hi
B hello