【Python】__init__.py理解

Python中每一个包都必须包含__init__.py文件,如果没有该文件,则表示普通目录,不能用于包引入。

例如:



可以认为__init__.py 文件是包的标志,__init__.py可以为空,什么都不写。

如果__init__.py文件为空,引用模块如下,将test引入命名空间,进而访问test的属性和方法


>>> from package1 import test
>>> test
<module 'package1.test' from 'package1\test.py'>
>>> from package1 import * 不能这样写,因为__init__.py为空,相当于把空值引入命名空间,空值没有属性和方法的
>>> test
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'test' is not defined

导入一个包时,实际上是导入了它的__init__.py文件,将__init__.py里面的包和模块导入命名空间,通过命名空间访问导入模块的属性和方法。可以通过编写__init__.py文件控制包的模块引用。

import test
import test1
import test2

或者

__all__ = ['test', 'test1', 'test2']

结果:

>>> from package1 import *
>>> test
<module 'package1.test' from 'package1\test.pyc'>
>>> test2
<module 'package1.test2' from 'package1\test2.py'>
>>> test1
<module 'package1.test1' from 'package1\test1.py'>

这里有个缺点,不能直接访问模块里面具体的方法

>>> from package1 import *
>>> test.fun     # 必须model开头引入,因为之前只是将模块引入了命名空间
<function fun at 0x025BB4B0>
>>> fun
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'fun' is not defined

可以将所有的方法也直接写入命名空间 __init__.py文件内容

from test import *
from test1 import *
from test2 import *
>>> from package1 import *
>>> fun
<function fun at 0x025FB470>

总结:

import subpackage1.a # 将模块subpackage.a导入全局命名空间,例如访问a中属性时用subpackage1.a.attr
from subpackage1 import a # 将模块a导入全局命名空间,例如访问a中属性时用a.attr_a
from subpackage.a import attr_a # 将模块a的属性直接导入到命名空间中,例如访问a中属性时直接用attr_a

具体import语句引用机制,可以参考https://www.cnblogs.com/Lands-ljk/p/5880483.html,写的挺好的

本文参考来源: https://www.cnblogs.com/Lands-ljk/p/5880483.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值