目标
- 了解模块
- 导入模块
- 制作模块
- _ all_
- 包的使用方法
模块
Python模块(Module),是一个Python文件,以.py结尾,包含了Python对象定义和Python语句。
模块能定义函数,类和变量,模块也能包含可执行的代码
在project里的lib下
导入和使用模块
导入模块就是导入指定类的所有代码,不是类似Java的引用
方法一:import 模块名
调用功能:模块名.功能名
方法二: from 模块名 import 功能名
调用功能:功能名
只能调用导入的功能名,不能使用模块里的其它功能
方法二变型:from 模块名 import *
调用功能:功能名
能调用模块里的所有其它功能,基于_all_的引入
方法三:import 模块名 as 别名
模块定义别名,定义后,就只能使用别名
调用功能:别名.功能名
方法三变型:from 模块名 import 功能名 as 别名
功能定义别名
调用功能:模块名.别名
不推荐import导入多个模块
在python,涉及到类似除法的运算,得到的结果必定是浮点数
方法四:var = __ import__(’’)
在括号里写上要导入的模块名字,var为导入的模块名称,类似于别名
制作模块
类似Java里的工具类,自己写类,然后导入
测试信息可以用iif语句写上:
if __name__='__main__':
test(1, 1)
__name__是一个系统变量,在自己类里就是 __main __,在其他类里就是python文件名字
模块定位顺序
当导入一个模块时,python解释器对模块位置搜索顺序是:
- 当前目录
- 如果不在当前目录,python则搜索在shell变量PYTHONPATH下的每个目录
- 如果都找不到,Python会查看默认路径。UNIX下,默认路径为/usr/local/lib/pthon/
- 模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录
- 注意
- 自己的文件名不要和已有的模块名重复,否则导致模块功能无法使用
- 使用from 模块名 import 功能名的时候,如果功能名名字重复,调用的是最后定义或导入的功能。
- 最后,类似于Java里的自定义类的类名不要跟原有的类相同!方法名也不能相同
random里的randint(start, end):从开始到结尾中间获得一个随机int数字
名字重复的严重性:导入模块,就是把代码全部拿来了,模块名就是一个引用
__ all__
如果一个模块文件中有__ all__变量,当使用from xxx import * 导入时,只能导入这个列表中的元素
包
包将有有联系的模块组织在一起,即放在同一个文件夹,并且在这个文件夹下创建一个名字为__ init__.py文件,那这个文件夹就称为包
注意:新建包后,包内部会自动建一个名字为__ init__.py文件,控制着包的导入行为
类似Java里的包
导入包
方法一:
import 包名.模块名
包名.模块名.功能()
方法二:
注意:必须在__ Init__.py文件中添加 __ all__ = [],控制导入的模块列表,不写将无法导入任何一个模块
from 包名 import *
模块名.目标
拓展:
__ dict__
类名.__ dict__
收集类内部所有属性和方法对应的字典
实例对象.__ dict__
收集对象的实例属性和值组成的字典:就是init函数里的初始化属性
class A(object):
a = 0
def __init__(self):
self.b = 1
aa =A()
# {'__module__': '__main__', 'a': 0, '__init__': <function A.__init__ at 0x00000000021F51E0>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
print(A.__dict__)
# {'b': 1} 实例对象的属性和属性值组成的字典,但是实例属性a还是有的
print(aa.__dict__)
print(aa.a)
列表推导式
加载数据,转换对象
eval用于自动转换字符串数据的类型,将其转换为对应的类型