1、什么是模块
当数据多了的时候,需要有东西来装数据,根据使用目的,Python提供了list,tuple,dict,set,此外还有一些数据结构。当代码多了的时候,需要一种方式把代码组织起来,于是有了函数。
当函数多了的时候,该怎么组织函数呢?前面的数据结构,函数,我从组织管理的角度来阐释他们,都是因为面对的问题太多了,因此需要抽象封装。你写了几个和时间转换相关的函数,同时还写了几个和文件操作相关的函数,请问,你会把他们放在一个脚本里么?
如果是我,就不会这样做。我会写两个脚本,一个脚本专门放和时间处理有关的函数,一个脚本专门放和文件操作相关的函数。这样做有非常多的好处,查找,修改都变的非常方便,想想你自己的电脑里,电影会和歌曲放在同一个文件夹下么?
当我们把一类函数放在一个脚本里时,这个脚本就是一个模块。不要被这些陌生的名词吓到,我们平时生活中很多的做法都是模块化的,你书架上的书肯定是按照类别存放的,你的衣物也大约是按照季节整理的,你的抽屉也是划分了不同的存储功能,第一层专门放小工具,第二层专门放证件。。。。。即便你是一个生活凌乱的人,厨房里的盘子和碗肯定是分开来放的吧,一定是盘子罗在一起,碗罗在一起,然后碗落在盘子上,不可能是一个盘子,一个碗,再一个盘子一个碗。
2、如何使用
新建一个脚本,名为kwsyTime.py,内容如下
# coding=utf-8
import datetime
import time
def seconds_to_datetime(seconds):
'''秒转日期'''
time_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(seconds))
return datetime.datetime.strptime(time_str, '%Y-%m-%d %H:%M:%S')
def datetime_to_seconds(date):
'''日期转秒'''
return int(time.mktime(date.timetuple()))
def get_today_start():
'''获得今天0点时间'''
now = datetime.datetime.now()
return datetime.datetime.strptime(str(now)[:10], '%Y-%m-%d')
def get_today_start_seconds():
today = get_today_start()
return datetime_to_seconds(today)
2.1 引用模块
再新建一个脚本,名为test.py,我要在test.py这个脚本里去引用kwsyFile这个模块,使用这个模块的get_today_start函数,代码如下
#coding=utf-8
import kwsyTime
print kwsyTime.get_today_start()
注意下面两点
模块的名称,就是脚本的名称去掉.py
想要使用某个方法,就在这个模块的后面加上一个点,再加上方法的名字
2.2 from 引用
除了使用import 这种直接引用模块的方法,还有一种from 的引用方法
#coding=utf-8
from kwsyTime import get_today_start
print get_today_start()
这种写法,from 指明要引用的模块,import 指明要引用的东西,如果你不确定要引用什么,可以在import 后面加 *,表示全部引入
from kwsyTime import *
2.3 命名冲突
上面这种from 的引用方法有一个好处,就是调用被引入模块方法时,不用每次都写模块名称,但是也存在一个弊端,就是容易引起命名冲突,看代码
#coding=utf-8
from kwsyTime import get_today_start
print get_today_start()
def get_today_start():
return u'冲突'
print get_today_start()
kwsyTime模块里有一个方法叫get_today_start,而test.py模块里也有一个这个名字的方法,程序执行的结果是
2017-03-22 00:00:00
冲突
第一次执行时,执行的是kwsyTime模块里的方法
第二次执行时,执行的是test.py脚本里的方法
由于名称相同,一不小心就弄混了,所以,使用from这种引用方法时,一定要注意是不是存在命名冲突的情况。