python系统学习【三】模块和文件处理
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__ 。这句话的意思就是,当模块被直接运行时,以下代码块将被运行,当模块是被导入时,代码块不被运行。
