文章目录
- 1. 模块化
- 1.1 模块的概念
- 1.2 模块的调用
- 1.3 `__init__.py` 文件
- 1.4 模块搜索路径
- 1.5 绝对引用和相对引用
- 1.6 `if __name__ == '__main__'`
- 2. 文件处理
1. 模块化
在Python中,一个.py文件就称之为一个模块(Module)
为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。
引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。
1.1 模块的概念
1.2 模块的调用
文件结构:
trymodule
│ first.py
│ test.py
├───folder1
│ │ abcd.py
│ │ __init__.py
trymodule文件:
(1)用法1:
# first.py
a = 1
def myfun(s):
print(s + 1)
另一个py文件:
# test.py
import first
print(a)
'''
报错
Traceback (most recent call last):
File "/Users/bytedance/Downloads/Project/pythonStudy/trymodule/1.py", line 3, in <module>
print(a)
NameError: name 'a' is not defined
'''
print(first.a) # 1
所以说first.py
文件就是一个模块,可以用import
导入,里面变量都要用first.
前缀来引用,如果想不使用这个前缀可以这样:
(2)用法2:
# test.py
from first import a
print(a) # 1
(3)用法3:
# test.py
# 重命名
from first import myfun as addone
addone(4) # 5
# 导入模块中全部变量
from first import *
myfun(2) # 3
# 一次导入多个变量
from first import a, myfun
print(a) # 1
包的导入:
# abcd.py
b = 2
class Myclass:
def __init__(self, name, age):
self.name = name
self.age = age
def get_info(self):
print('my name is {name} and age is {age}'.format(name = self.name, age = self.age))
看一下下面的几种导入方式:
# test.py
import folder1
print(folder1.abcd.b) # 报错
'''
Traceback (most recent call last):
File "/Users/bytedance/Downloads/Project/pythonStudy/trymodule/test.py", line 3, in <module>
print(folder1.abcd.b)
AttributeError: module 'folder1' has no attribute 'abcd'
'''
from folder1 import abcd
bob = abcd.Myclass(name = 'Bob', age = 20)
print(bob.name) # Bob
from folder1.abcd import b
print(b) # 2
import folder1.abcd
print(abcd.b) # 报错
'''
Traceback (most recent call last):
File "/Users/bytedance/Downloads/Project/pythonStudy/trymodule/test.py", line 19, in <module>
print(abcd.b)
NameError: name 'abcd' is not defined
'''
import folder1.abcd
print(folder1.abcd.b) # 2
import folder1.abcd as aa
print(aa.b) # 2
- 只是导入包不能随便使用其中的模块,要导入到具体模块或者变量的层次
- 文件夹与文件之间可以用
.
也可以用from import
格式,而文件与里面的变量之间只能用from import
格式,即不能import folder1.abcd.b
1.3 __init__.py
文件
每一个包目录下面都会有一个__init__.py
的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。__init__.py
可以是空文件,也可以有Python代码,因为__init__.py
本身就是一个模块。当用 import 导入该目录时,会执行 __init__.py
里面的代码。
1.4 模块搜索路径
程序所在目录、标准安装目录、标准库安装目录、Python环境变量所包含的目录。
如果你自定义的模块与内置模块重名的话,会调用你的模块而非内置的模块,所以在命名模块的时候还是尽量别重名。如果硬是要同名且两个模块都用到,可以使用「完整路径引入」,并使用as 关键字为模块设置别名。另外,如果你的模块都不在这些搜索路径里的话,可以通过调用sys.path.append(“路径”)临时把路径添加到搜索路径中。
1.5 绝对引用和相对引用
- 绝对引用是通过
.
的连接,指定出最高级文件(夹),到目标文件的绝对路径。我们上面的所有用法都属于绝对引用。 - 而相对引用是 指定待引用模块与当前文件的相对位置,
.
表示上一级文件
1.6 if __name__ == '__main__'
__name__
是当前模块名,当模块被直接运行时模块名为 __main__
。这句话的意思就是,当模块被直接运行时,以下代码块将被运行,当模块是被导入时,代码块不被运行。
参考
2. 文件处理
参考