文章目录

  • 1. 模块化
  • 1.1 模块的概念
  • 1.2 模块的调用
  • 1.3 `__init__.py` 文件
  • 1.4 模块搜索路径
  • 1.5 绝对引用和相对引用
  • 1.6 `if __name__ == '__main__'`
  • 2. 文件处理


1. 模块化

python模块化讲的很好但是有点乱分类说的很清晰

在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. 文件处理

参考