Python中的init.py有什么作用
发布时间:2025-05-13 14:59:14 发布人:远客网络
一、Python中的init.py有什么作用
你指的应该是是__init__.py文件,以下下详细解释:
__init__.py该文件的作用就是相当于把自身整个文件夹当作一个包来管理,每当有外部import的时候,就会自动执行里面的函数。
1.标识该目录是一个python的模块包(module package)
如果你是使用python的相关IDE来进行开发,那么如果目录中存在该文件,该目录就会被识别为 module package。
假设我们的模块包的目录结构如下:
如果我们使用最直接的导入方式,将整个文件拷贝到工程目录下,然后直接导入:
from mypackage.subpackage_1 import test11
from mypackage.subpackage_1 import test12
from mypackage.subpackage_2 import test21
from mypackage.subpackage_2 import test22
from mypackage.subpackage_3 import test31
from mypackage.subpackage_3 import test32
这样的话,看起来就会很麻烦,查找的时候也会麻烦,此时__init__.py就起到了简化的作用。
实际上,如果目录中包含了__init__.py时,当用 import导入该目录时,会执行__init__.py里面的代码。我们在mypackage目录下增加一个__ init __.py文件来做一个实验:
mypackage/__init__.py里面加一个print,如果执行了该文件就会输出
print("You have imported mypackage")
很显然,__init__.py在包被导入时会被执行。
我们再做一个实验,在 mypackage/init.py添加以下语句:
from subpackage_1 import test11
>>> import mypackageTraceback(most recent call last):
File"<stdin>", line 1, in<module>
File"/home/taopeng/Workspace/Test/mypackage/__init__.py", line 2, in<module>
from subpackage_1 import test11ImportError: No module named'subpackage_1'
原来,在我们执行import时,当前目录是不会变的(就算是执行子目录的文件),还是需要完整的包名。
from mypackage.subpackage_1 import test11
综上,我们可以在init.py指定默认需要导入的模块
有时候我们在做导入时会偷懒,将包中的所有内容导入
这是怎么实现的呢?__all__变量就是干这个工作的。
__all__关联了一个模块列表,当执行from xx import*时,就会导入列表中的模块。我们将__init__.py修改为:
__all__= ['subpackage_1','subpackage_2']
这里没有包含subpackage_3,是为了证明__all__起作用了,而不是导入了所有子目录。
>>> from mypackage import*
>>> dir()['__builtins__','__doc__','__loader__','__name__','__package__','__spec__','subpackage_1','subpackage_2']
>>> dir(subpackage_1)['__doc__','__loader__','__name__','__package__','__path__','__spec__']
子目录的中的模块没有导入!!!
该例子中的导入等价于:from mypackage import subpackage_1, subpackage_2
因此,导入操作会继续查找 subpackage_1和 subpackage_2中的__init__.py并执行。(但是此时不会执行 import*)
我们在 subpackage_1下添加__init__.py文件:
__all__= ['test11','test12']#默认只导入test11
from mypackage.subpackage_1 import test11
>>> from mypackage import*
>>> dir()['__builtins__','__doc__','__loader__','__name__','__package__','__spec__','subpackage_1','subpackage_2']
>>> dir(subpackage_1)['__all__','__builtins__','__cached__','__doc__','__file__','__loader__','__name__','__package__','__path__','__spec__','test11']
如果想要导入子包的所有模块,则需要更精确指定。
>>> from mypackage.subpackage_1 import*
>>> dir()['__builtins__','__doc__','__loader__','__name__','__package__','__spec__','test11','test12']
在了解了__init__.py的工作原理后,应该能理解该文件就是一个正常的python代码文件。
因此可以将初始化代码放入该文件中。
二、python中的__init__(self)是什么意思呢
1、Python中,__init__()方法是所谓的对象的“构造函数”,负责在对象初始化时进行一系列的构建操作
2、pass
在Python中,对某个类实例进行成员赋值,可以创建不存在的成员:
3、在Python中,对某个类实例进行成员赋值,可以创建不存在的成员:
4、>>>a.name='Bob'
如果对于每一个worker类的实例对象,都要进行如此赋值的话,这个类会变得很难使用
5、如果对于每一个worker类的实例对象,都要进行如此赋值的话,这个类会变得很难使用
6、另外,对于用于特殊场合的类,可能要求在对象创建时,进行连接数据库、连接FTP服务器、进行API验证等操作,这些初始化操作,都可以封装在__init__()方法中进行
7、__init__方法使用如下规则定义:
8、pass
__init__方法必须接受至少一个参数即self,Python中,self是指向该对象本身的一个引用,通过在类的内部使用self变量,类中的方法可以访问自己的成员变量,简单来说,self.varname的意义为”访问该对象的varname属性“
9、__init__方法必须接受至少一个参数即self,Python中,self是指向该对象本身的一个引用,通过在类的内部使用self变量,类中的方法可以访问自己的成员变量,简单来说,self.varname的意义为”访问该对象的varname属性“
10、当然,__init__()中可以封装任意的程序逻辑,这是允许的,__init__()方法还接受任意多个其他参数,允许在初始化时提供一些数据,例如,对于刚刚的worker类,可以这样写:
11、self.pay=pay
这样,在创建worker类的对象时,必须提供name和pay两个参数:
12、这样,在创建worker类的对象时,必须提供name和pay两个参数:
13、>>>b=worker('Jim',5000)
Python会自动调用worker.__init__()方法,并传递参数。
14、Python会自动调用worker.__init__()方法,并传递参数。
15、通常情况下,self形参由Python自动赋值,但是,在类继承中,并不是这样
16、例如,Python的HTML处理工具HTMLParser,是一个基于OOP模型的工具,要使用该工具,必须编写一个类,继承html.parser.HTMLParser类,并重载一系列方法,以定制自己的功能
17、HTMLParser.__init__(self)
此处,需要调用了HTMLParser类的__init__方法,而且,此处手动给HTMLParser.__init__()方法的self形参赋值,事实上,如果不显式指定self形参的值,Python不会在此处自动为HTMLParser.__init__()方法的self形参进行赋值
18、此处,需要调用了HTMLParser类的__init__方法,而且,此处手动给HTMLParser.__init__()方法的self形参赋值,事实上,如果不显式指定self形参的值,Python不会在此处自动为HTMLParser.__init__()方法的self形参进行赋值
19、如此设计的原因是,在子类中需要获得超类的成员和方法,而通过在子类的__init__方法中调用超类的__init__方法,并手动给它传递指向子类的self值,可以使超类的__init__方法将所初始化的变量设置成子类的变量,这样,就可以在子类中直接访问超类的变量了。
三、python脚本下面的 __init__.py 有什么作用呢
1、首先一旦创建一个python的package,就会出来一个_init_.py的文件
2、一个是导入该package下的girl文件的hello函数
3、一个是导入该package下的girl文件的所有函数
4、比如在bb.py这个文件中导入girl的hello函数
5、原来init.py文件为空时:方法如下:
6、至于第一个init.py有导入的作用,但我认为意义不大,
7、所以当前认为init.py最大的作用是区别该文件夹是package,还是纯粹的目录。