1. 模块化
python模块化 讲的很好但是有点乱 分类说的很清晰
在Python中,一个.py文件就称之为一个模块(Module) 为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。 引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。
1.1 模块的概念
模块的 概念
1.2 模块的调用
文件结构:
trymodule
│ first.py
│ test.py
├───folder1
│ │ abcd.py
│ │ __init__.py
trymodule文件: (1)用法1:
a = 1
def myfun(s):
print(s + 1)
另一个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)
所以说first.py 文件就是一个模块,可以用import 导入,里面变量都要用first. 前缀来引用,如果想不使用这个前缀可以这样: (2)用法2:
from first import a
print(a)
(3)用法3:
from first import myfun as addone
addone(4)
from first import *
myfun(2)
from first import a, myfun
print(a)
包的导入:
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))
看一下下面的几种导入方式:
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)
from folder1.abcd import b
print(b)
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)
import folder1.abcd as aa
print(aa.b)
- 只是导入包不能随便使用其中的模块,要导入到具体模块或者变量的层次
- 文件夹与文件之间可以用
. 也可以用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. 文件处理
参考
|