Python3 __init__.py和__init__函数的作用
文章目录
一.__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:
class A(object):
def __init__(self, name):
self.name=name
print("name:", self.name)
def getName(self):
return 'A ' + self.name
1.子类不重写__init__
,实例化子类时,会自动调用父类定义的__init__
子类B继承父类A
class B(A):
def getName(self):
return 'B '+self.name
if __name__=='__main__':
b=B('hello')
print b.getName()
输出结果为:
name: hello B hello
2.子类重写了__init__
时,实例化子类,就不会调用父类已经定义的__init__
方法
3.子类为了能使用或扩展父类的行为,最好显示调用父类的__init__
方法
class 子类:
def __init__(self,参数) :
super(子类,self).__init__(参数) #执行父类的__init__方法
class A(object):
def __init__(self, name):
self.name=name
print("name:", self.name)
def getName(self):
return 'A ' + self.name
class B(A):
def __init__(self, name):
super(B, self).__init__(name)
print "hi"
self.name = name
def getName(self):
return 'B '+self.name
if __name__=='__main__':
b=B('hello')
print(b.getName())
输出结果:
name: hello hi B hello
文章作者 honour
上次更新 2018-05-22