原标题:技术图文:如何利用 Python 做一个简单的定时器类?
背景
今天在B站上看有关 Python 最火的一个教学视频 -- “零基础入门学习 Python”,这也是我们 Python基础刻意练习活动 的推荐视频教程。
python视频
在学习魔法方法的时候,有一节视频是制作一个简单的定时器类,基本要求如下:
定制一个计时器的类。
start和stop方法代表启动计时和停止计时。
假设计时器对象t1,print(t1)和直接调用t1均显示结果。
当计时器未启动或已经停止计时时,调用stop方法会给予温馨的提示。
两个计时器对象可以进行相加:t1+t2。
只能使用提供的有限资源完成。
技术分析
Python 的time模块中,时间表现的格式主要有三种:
timestamp时间戳,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。
struct_time时间元组,共有九个元素组。
format time格式化时间,用格式化的结构使时间更具可读性。包括自定义格式和固定格式。
获取时间戳
time.time返回当前时间的时间戳(1970纪元后经过的浮点秒数)。
importtime
ticks = time.time
print( '当前时间戳为:', ticks) # 当前时间戳为: 1570793479.162907
获取当前时间元组
time.localtime([sec])格式化时间戳为本地的时间。如果sec参数未输入,则以当前时间为转换标准。
importtime
localtime = time.localtime(time.time)
print( "本地时间为 :", localtime)
# 本地时间为 : time.struct_time(tm_year=2019, tm_mon=10, tm_mday=11, tm_hour=19, tm_min=35, tm_sec=31, tm_wday=4, tm_yday=284, tm_isdst=0)
tm_year:4位数年
tm_mon:月
tm_mday:日
tm_hour:小时
tm_min:分钟
tm_sec:秒
tm_wday:一周的第几日,0到6 (0是周一)
tm_yday:一年的第几日
tm_isdst:夏令时,值有:1(夏令时)、0(不是夏令时)、-1(未知),默认 -1
获取格式化的时间
time.asctime([tupletime])接受时间元组并返回一个可读的形式。
importtime
t = time.localtime
print( "本地时间为 : %s "% time.asctime(t))
# 本地时间为 : Fri Oct 11 19:42:34 2019
格式化时间
time.strftime(format[,tupletime])接收以时间元组,并返回以可读字符串表示的当地时间,格式由format决定。
time.strptime(str,format='%a %b %d %H:%M:%S %Y')根据format的格式把一个时间字符串解析为时间元组。
time.mktime(tupletime)接受时间元组并返回时间戳(1970纪元后经过的浮点秒数)。
importtime
print(time.strftime( "%Y-%m-%d %H:%M:%S", time.localtime))
# 2019-10-11 19:48:31
print(time.strftime( "%a %b %d %H:%M:%S %Y", time.localtime))
# Fri Oct 11 19:48:31 2019
a = "Fri Oct 11 19:48:31 2019"
print(time.mktime(time.strptime(a, "%a %b %d %H:%M:%S %Y")))
# 1570794511.0
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
Time 模块
time.gmtime([secs])接收时间戳(1970纪元后经过的浮点秒数)并返回格林威治天文时间下的时间元组。
time.ctime([secs])把一个时间戳(按秒计算的浮点数)转化为time.asctime的形式,作用相当于asctime(localtime(secs)),未给参数相当于asctime。
time.sleep(secs)推迟调用线程的运行,secs指秒数。
代码实现
importtime
classMytime(object):
def__init__(self):
self.__info = '未开始计时!'
self.__begin = None
self.__end = None
self.__jg = 0
def__str__(self):
returnself.__info
def__repr__(self):
returnself.__info
defstart(self):
print( '计时开始...')
self.__begin = time.localtime
defstop(self):
ifnotself.__begin:
print( '提示:请先调用start开始计时!')
return
self.__end = time.localtime
self.__jg = time.mktime(self.__end) - time.mktime(self.__begin)
self.__info = '共运行了%d秒'% self.__jg
print( '计时结束!')
returnself.__jg
def__add__(self, other):
return'共运行了%d秒'% (other.__jg + self.__jg)
t1 = Mytime
print(t1)
# 未开始计时!
t1.stop
# 提示:请先调用start开始计时!
t1.start
# 计时开始...
time.sleep( 5)
t1.stop
# 计时结束!
print(t1)
# 共运行了5秒
t2 = Mytime
t2.start
# 计时开始...
time.sleep( 7)
t2.stop
# 计时结束!
print(t2)
# 共运行了7秒
print(t1 + t2)
# 共运行了12秒
总结
这个题目让我们熟悉了 Python 中time模块的使用方法,以及类的定义和类中的一系列魔法方法,如__init__、__str__、__repr__、__add__等等,Python 的魔法方法很是神奇啊,把面向对象中的构造函数、析构函数、运算符的重载等全部包含了进去。需要好好体会才能把这块的知识学好。今天就这样吧!See You!
参考文献
https://www.bilibili.com/video/av4050443
https://www.cnblogs.com/lichunl/p/9098024.html
相关图文:
经过8年多的发展,LSGO软件技术团队在「地理信息系统」、「数据统计分析」、「计算机视觉」等领域积累了丰富的研发经验,也建立了人才培养的完备体系,目前深耕的领域为「机器学习与量化金融」,欢迎对计算机技术感兴趣的同学加入,与我们共同成长进步。
后台回复「搜搜搜」,随机获取电子资源!返回搜狐,查看更多
责任编辑: