Python学习笔记
模块
可以认为模块是一个 工具箱
,里面提供各种各样的 工具
。
变量,函数,类都可以定义在模块中。
模块分类
系统模块
系统给出的,可以直接使用的模块
自定义模块
用户写的一个 .py
文件就是一个模块
模块的使用
导入和使用模块
# 导入:import 模块名 --> 导入整个模块,此时整个目标模块被完整执行一遍
import moduleX
# 使用: 模块名.变量名/类名/函数名
moduleX.func()
cls1 = moduleX.Cls1()
print(moduleX.value1)
# 导入:from 模块名 import 变量名,类名,函数名 --> 导入模块中的几样
from moduleX import value1,func,Cls1
# 使用:直接使用
func()
cls1 = Cls1()
print(value1)
# 导入:from 模块名 from * --> 导入模块中全部内容
from moduleX import *
# 使用:直接使用
func()
cls1 = Cls1()
print(value1)
限制执行部分代码
导入整个模块时,目标模块会被完整执行。如果目标模块中有不需要被执行的代码,可以用以下方法加以限制
# 需要在调用时可执行的代码块
if __name__=='__main__':
# 需要仅在本模块执行的代码块
__name__
:在本模块中调用,返回结果为 __main__
;如果在其他模块中调用,返回结果为 模块名
包
包是用来对模块进行组织和收纳的工具;把 模块
放进 包
就像把 工具箱
放进 收纳柜
一样
Python中包和文件夹的异同
目录中有
__init__.py
文件的叫包,没有的叫文件夹
利用包可以避免项目中模块名的混淆和冲突
包的使用
如果有包,就先加载包(执行 __init__.py
文件,只执行一次)
导入和使用包
# 导入模块中所有内容(即使是同一个包,也要写包名)
import 包名.模块名
from 包名.模块名 import *
# 使用:
# import方式导入
包名.模块名.方法名()
# from方式导入
方法名()
通配符 *
该通配符会将模块 除受限制的内容外
的所有内容进行导入
限制导入列表: 制定一个列表,当使用通配符时仅导入该列表载明的内容
__all__ = ['func1','class1','value1'] # 此时使用通配符,仅导入这三样内容
value1 = 1
value2 = 2
def func1():
pass
def func2():
pass
class class1:
pass
class class2:
pass
init 文件
可以认为该文件是 魔术的
,只要导入包就会执行此模块,且只执行一次。
该文件中可以定义一些函数,变量或者类,在导入包的时候导入或执行
也可以单纯导入init中的函数,变量或者类,也可以在init文件中调用包中的模块。其通配符 *
也可以受到限制导入列表的控制。
from 包名 import *
循环导入
我们常常可以在不同的包跟模块间互相调用,也因此常常会陷入循环导入的陷阱。
什么是循环导入
'''
如何陷入循环导入的陷阱
'''
from package2.module2 import func2
def func1():
print('package1.func1')
func2()
# package2.module2
from package1.module1 import func1
def func2():
print('package2.func2')
func1()
如何解决循环导入
重构代码
在代码量少的时候可以选择重构代码以解决循环导入的问题
将导入语句后置
将导入语句放到调用的地方,在某些情况下还可置于末尾
# package1.module1
def func1():
print('package1.func1')
from package2.module2 import func2
func2()
# package2.module2
def func2():
print('package2.func2')
from package1.module1 import func1
func1()