一、module 模块自定义
if name == ‘main’:
一般情况下,当我们写完自定义的模块之后,都会写一个测试代码,检验一些模块中各个功能是否能够成功运行。
if __name__=='__main__':
def test_my_book ():
print(my_book)
def test_say_hi():
say_hi('孙悟空')
say_hi(User('Charlie'))
def test_User():
u = User('白骨精')
u.walk()
print(u)
test_my_book()
test_say_hi()
test_User()
if name == ‘main’: 的作用是确保只有单独运行该模块时,此表达式才成立,才可以进入此判断语法,执行其中的测试代码;反之,如果只是作为模块导入到其他程序文件中,则此表达式将不成立,运行其它程序时,也就不会执行该判断语句中的测试代码。
二、导入模块的3种方式(超级详细)
(1)通常情况下,当使用 import 语句导入模块后,Python 会按照以下顺序查找指定的模块文件:
1.在当前目录,即当前执行的程序文件所在目录下查找;
2.到 PYTHONPATH(环境变量)下的每个目录中查找;
3.到 Python 默认的安装目录下查找。
(2)为了让 Python 能找到自定义(或第三方提供) 的模块,可以用以下 3 种方式来告诉它:
1.向 sys.path 中临时添加模块文件存储位置的完整路径;
2.将模块放在 sys.path 变量中已包含的模块加载路径中。
3.设置系统环境变量。
模块文件的存储位置,可以临时添加到 sys.path 变量中,即向 sys.path 中添加 D:\python_module(hello.py 所在目录),在 say.py 中的开头位置添加如下代码:
import sys
sys.path.append('D:\\python_module')
三、导入模块的本质
1.使用“import fk_module”导入模块的本质就是,将 fk_module.py 中的全部代码加载到内存并执行,然后将整个模块内容赋值给与模块同名的变量,该变量的类型是 module,而在该模块中定义的所有程序单元都相当于该 module 对象的成员。
2.使用“from fk_module import name, hello”导入模块中成员的本质就是将 fk_module.py 中的全部代码加载到内存并执行,然后只导入指定变量、函数等成员单元,并不会将整个模块导入
在导入模块后,可以在模块文件所在目录下看到一个名为“pycache”的文件夹,打开该文件夹,可以看到 Python 为每个模块都生成一个 *.cpython-36.pyc 文件,比如 Python 为 fk_module 模块生成一个 fk_ module.cpython-36.pyc 文件,该文件其实是 Python 为模块编译生成的字节码,用于提升该模块的运行效率。
四、__all__变量用法
在默认情况下,如果使用“from 模块名 import *”这样的语句来导入模块,程序会导入该模块中所有不以下画线开头的成员(包括变量、函数和类)。
但在一些场景中,我们并不希望每个成员都被暴露出来供外界使用,此时可借助于模块的 all 变量,将变量的值设置成一个列表,只有该列表中的成员才会被暴露出来。
'''测试__all__变量的模块'''
def hello():
print("Hello, Python")
def world():
print("Pyhton World is funny")
def test():
print('--test--')
# 定义__all__变量,指定默认只导入hello和world两个成员
__all__ = ['hello', 'world']
上面的 all 变量指定该模块默认只被导入 hello 和 world 两个成员。下面程序示范了模块中 all 变量的用处:
# 导入all_module模块内所有成员
from all_module import *
hello()
world()
test() # 会提示找不到test()函数
如果确实希望程序使用模块内 all 列表之外的成员,有两种解决方法:
1.**第一种是使用“import 模块名”来导入模块。**在通过这种方式导入模块之后,总可以通过模块名前缀(如果为模块指定了别名,则可以使用模快的别名作为前缀)来调用模块内的成员。
2.**第二种是使用“from 模块名 import 成员”来导入指定成员。**在这种方式下,即使想导入的成员没有位于 all 列表中,也依然可以导入。
五、包(存放多个模块的文件夹)
1.什么是包呢?简单理解,包就是文件夹,只不过在该文件夹下必须存在一个名为“init.py” 的文件。
每个包的目录下都必须建立一个 init.py 的模块,可以是一个空模块,可以写一些初始化代码,这是 Python 的规定,其作用就是告诉 Python 要将该目录当成包来处理。
注意,__init__.py 不同于其他模块文件,此模块的模块名不是 __init__,而是它所在的包名。
例如,在 settings 包中的 __init__.py 文件,其模块名就是 settings。
- init.py作用详解
我们知道,导入包就等同于导入该包中的 init.py 文件,因此完全可以在 init.py 文件中直接编写实现模块功能的变量、函数和类,但实际上并推荐大家这样做,因为包的主要作用是包含多个模块。
因此 init.py 文件的主要作用是导入该包内的其他模块。
六、查看模块(变量、函数、类)方法
为了查看模块包含什么,可以通过如下两种方式:
1.使用 dir() 函数。
2.使用模块本身提供的 all 变量。
七、__doc__属性:查看文档
使用 help() 函数查看的其实就是程序单元的 doc 属性值。
-================================================================
capwords() 函数的作用就是将给定的 s 字符串中每个单词的首字母变成大写的。该函数可通过 sep 参数指定分隔符:如果不指定 sep 参数,该字符串默认以空白作为分隔符。
capwords(s [,sep])
八、__file__属性:查看模块的源文件路径