# aaa/__init__.py
print(__name__)
num = 10
"""
__init__.py是个什么鬼?

包的本质就是文件夹,导入包就相当于导入包下的__init__.py文件
""" # a.py import aaa print(aaa.num)

执行结果:

aaa
10

看个复杂的包的使用各种报错(这种导入包的方式不推荐)

# a.py
import os

os.makedirs('glance/api')  # 创建目录
os.makedirs('glance/cmd')
os.makedirs('glance/db')
init_lst = ['glance/__init__.py', 'glance/api/__init__.py', 'glance/cmd/__init__.py', 'glance/db/__init__.py']
for initFile in init_lst:  # 创建文件并写入内容
    with open(initFile, "w", encoding="utf-8") as f:
        f.write(f"""#{initFile}""")

file_lst = ['glance/api/versions.py', 'glance/cmd/manage.py', 'glance/db/models.py', 'glance/api/policy.py']
for filePath in file_lst:
    with open(filePath, "w", encoding="utf-8") as f:  # 创建文件并写入内容
        f.write(f"""# {filePath}
def func():
    print("我在{filePath}中")""")

执行这个a.py文件,会创建一个glance文件夹,里面有三个文件夹api、cmd 和db,有几个py文件。

# b.py
import glance


glance.api.policy.func()

执行结果:

Traceback (most recent call last):
  File "G:/python28/code/day06/整理笔记/python模块的使用/b.py", line 5, in <module>
    glance.api.policy.func()
AttributeError: module 'glance' has no attribute 'api'

原因分析:

因为glance.api实际上是导入的glance下的__init__.py,因为glance/__init__.py是个空文件,并没有api包的导入,所以报错。

解决这个报错:

#glance/__init__.py
import glance.api

执行结果:

Traceback (most recent call last):
  File "G:/python28/code/day06/整理笔记/python模块的使用/b.py", line 5, in <module>
    glance.api.policy.func()
AttributeError: module 'glance.api' has no attribute 'policy'

依然报错,接着按照上面的处理方法处理:

#glance/api/__init__.py
import glance.api.policy

执行结果:

我在glance/api/policy.py中

正常了,但是这个解决办法太麻烦了,需要在每个包的__init__.py文件中做包和模块的导入。

12-26 16:48
查看更多