Python学习--Day 23
- 视频来源:python视频 900集
169.包的导入
- 在pycharm中分别创建文件夹,一个包中可以放多个模块,一个包中可以放多个模块。
- 使用包中模块的某个函数,
from 包名 import 模块
+模块.函数()
或可以使用from 包名.模块 import 函数
+函数()
或可以使用from 包名.模块 import *
+函数()
,可以使用__all__()
对*
的内容进行限制,没有被alll指定的内容会被私有化。
同理,和可以使用上述方法对变量、类进行导入。
170.包的导入
- 复习:使用
if __name__ == '__main__':
对执行的内容进行限制。
if __name__ == '__main__':
print(version)
- 同一个包内的py文件之间相互调用,要使用全称
from 包名.模块 import 函数
或省略包名from .模块 import 函数
,不同包之间的相互调用更要书写全称,具体的书写可以参考下面的例子:
'''文件目录结构:
article
|--models.py
|show
|--__init__.py
|--...
user
|--models.py
|--user
|--__init__.py
|--test.py
calculate.py
|--add
即便test文件与user下的models.py处于同一目录下,也不建议直接使用import models, 要使用from user.models import User
'''
# 主文件是test.py
# 调用user下的models.py
from user.models import user
# 或使用:
from .models import user
# 调用article下的models
from article.models import show
# 调用calculate
from calculate import add
171.包的__init__文件
- 包中的
__init__
文件是用户进行导入包操作的时候,默认会执行__init__
文件;在__init__
内的函数,可以直接调用,不必再添加模块名称__init__
该文件的作用:①.当导入包的时候,把一些初始化的函数、变量、类等定义在__init__.py文件中;②此文件中函数、变量等的访问,只需要包名.函数
就可以。③结合__all__ = [..通过*可以被访问的模块..]
使用。
'''
user
|--__init__.py
'''
print('__init__')
def create_app():
print('----create')
'''文件结构:
user
|--__init__.py
|create_app
|--models.py
|--test.py
package.py(当前文件)
'''
improt user
user.create_app() # 注意不必指明__init__,直接使用.引用就可以
from 模块 import *
表示可以使用模块里面的所有内容,如果没有定义__all__所有的都可以访问到,但是如果定义了__all__,就是只有这个列表中的内容才可以被访问。from 包名 import *
表示该包中的内容(模块)不能访问的,需要在__init__.py文件中定义__all__ = [模块],以规定哪些模块可以被访问。
示例:
'''
user
|--__init__.py(当前文件)
|create_app
|--models.py
|pr
|--test.py
package.py
'''
__all__ = ['models']
print('__init__')
def create_app():
print('----create')
'''
user
|--__init__.py
|create_app
|--models.py(当前文件)
|pr
|--test.py
package.py
'''
print('__models__')
def pr():
print('----pr')
'''文件结构:
user
|--__init__.py
|create_app
|--models.py
|pr
|--test.py
package.py(当前文件)
'''
from user import *
user.pr() # 注意不必指明__init__,直接使用.引用就可以
172.模块的循环导入
- 循环导入的理解:两个模块之间相互调用:A模块中定义test()函数,调用B模块中的f函数;B模块中的f函数调用test()函数,形成循环调用。
'''
A模块:
def test():
f()
B模块:
def f():
test()
'''
- 循环调用示例:尽量避免,下面代码执行后会报错。
'''
xunhuan1(当前文件)
|task1
|task2
xunhuan2
|func
'''
from xunhuan2 import func
def task1():
print('task1--')
def task2():
print('task2--')
func()
task1()
# 运行结果:
# ImportError: cannot import name 'func' from 'xunhuan2' (D:\Pycharm\xunhuan2.py)
'''
xunhuan1
|task1
|task2
xunhuan2(当前文件)
|func
'''
from xunhuan1 import task1
def func():
task1()
print('xunhuan2---func')
- 大型项目中,需要很多的py文件,可能出现模块之间的循环导入,如何避免?①重新架构,成本比较大;②将import导入语句放入到函数中,将import的作用延后,并使用
if __name__=='__main__':
进行限制(参看下面的代码);③把导入语句放到最后。
因为将import放在文件的最前,代表如果import不通过,下面的代码就不能执行。
'''
xunhuan1(当前文件)
|task1
|task2
xunhuan2
|func
'''
from xunhuan2 import func
def task1():
print('task1--')
def task2():
print('task2--')
func()
if __name__=='__main__': # 这样在导入的时候,就不会产生问题
task1()
# 运行结果:
# ImportError: cannot import name 'func' from 'xunhuan2' (D:\Pycharm\xunhuan2.py)
'''
xunhuan1
|task1
|task2
xunhuan2(当前文件)
|func
'''
def func():
from xunhuan1 import task1 # 将import移动到函数内部
task1()
print('xunhuan2---func')
173.sys模块
-
搜索路径:当你导入一个模块的时候,Python解释器对模块位置的搜索顺序是:①当前目录;②如果不在当前目录,python则搜索在shell变量PYTHONPATH下的每个目录;③如果都找不到,Python会查看默认路径。Unix下默认路径一般为url/local/lib/python,模块搜索路径存储在system模块的sys.path路径变量中,变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。
-
Pycharm中,右键文件夹,选择Make Diectory as Source Route,会设定该文件夹为资源目录,将本文件夹放到sys.path中
-
sys常用的方法:
sys.path
、sys.version
、sys.argv
import sys
print(sys.path) # 返回搜索路径
print(sys.version) # 查看python版本
print(sys.argv) # 打印传输给当前python解释器的参数,运行时的参数,argv是一个列表
174.回顾+time模块
-
回顾:单例(除
__new__
还有其他的实现形式,包括装饰器、元类的方式等)、模块的导入、包的导入、循环导入的定义和解决方式、系统函数模块sys。 -
time模块中常用的方法:
①.时间戳:使用两个时间戳做差值可以得到运行时长
import time
t = time.time()
print(t)
②.休息:sleep(num)
,系统休眠num秒
③.将时间戳转成字符串:time.ctime(t)
,将时间戳格式数据t转换成当前时间。
④.将时间戳转换为元组的形式:time.;localtime(t)
,将时间戳格式数据转为元组形式。
⑤.将元组时间形式数据转换为时间戳:time.mktime(元组时间格式数据)
,返回的值是xxxx.0形式
⑥.将元组的时间转成字符串:time.strftime(format [,tuple])
,format可以选择%Y-%m-%d
等格式:
import time
t=time.time()
s = time.localtime(t)
t1 = time.strftime('%Y-%m-%d %H:%M:%S')
print(t1)
结果:2020-08-12 23:05:26
⑦.将字符串转成元组的方式:time.strptime()
r = time.strptime('2019/06/20','%Y/%m/%d')
print(r)
结果是:time.struct_time(tm_year=2019, tm_mon=6, tm_mday=20, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=171, tm_isdst=-1) -
总结time模块:重点的是time()、sleep()、strftime();了解的包括:元组时间格式localtime