Python 如何扩展datetime.timedelta?
我正在尝试扩展PythonPython 如何扩展datetime.timedelta?,python,datetime,Python,Datetime,我正在尝试扩展Pythondatetime.timedelta,以用于越野比赛结果。我想用u“mm:ss.s”格式的字符串构造一个对象。我可以使用factory设计模式和@classmethod注释来完成这项工作。我如何通过重写\uuuuu init\uuuuu和/或\uuu new\uuuuu来实现相同的功能 使用下面的代码,构造对象会引发TypeError。请注意,\uuuuuu init\uuuuu未被调用,因为my\uuuu init\uuuuu'中的'未被打印 import datet
datetime.timedelta
,以用于越野比赛结果。我想用u“mm:ss.s”
格式的字符串构造一个对象。我可以使用factory设计模式和@classmethod
注释来完成这项工作。我如何通过重写\uuuuu init\uuuuu
和/或\uuu new\uuuuu
来实现相同的功能
使用下面的代码,构造对象会引发TypeError。请注意,\uuuuuu init\uuuuu
未被调用,因为my\uuuu init\uuuuu'中的'未被打印
import datetime
import re
class RaceTimedelta(datetime.timedelta):
def __init__(self, timestr = ''):
print 'in my __init__'
m = re.match(r'(\d+):(\d+\.\d+)', timestr)
if m:
mins = int(m.group(1))
secs = float(m.group(2))
super(RaceTimedelta, self).__init__(minutes = mins, seconds = secs)
else:
raise ValueError('timestr not in format u"mm:ss.d"')
以下是错误:
>>>从mytimedelta导入RaceTimedelta
>>>RaceTimedelta(u'24:45.7')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:timedelta days组件的类型不受支持:unicode
>>>
如果我将代码从\uuuu init\uuuu
移动到\uuu new\uuuuu
,我会得到以下结果。请注意,这一次,输出显示调用了my\uuuu new\uuu
函数
>>RaceTimedelta(u'24:45.7')
在我的新__
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“mytimedelta.py”,第16行,新__
超级(比赛时间增量,自我)。\uuuu新的\uuuuu(分钟=分钟,秒=秒)
TypeError:datetime.timedelta.\uuuu new\uuuuu():参数不足
>>>
显然timedelta
对象是不可变的,这意味着它们的值实际上是在类“\uuuuu new\uuuuu()
方法中设置的,因此您需要重写该方法,而不是它的\uuu init\uuuuu()
:
输出:
0:24:45.700000
顺便说一句,我觉得奇怪的是,您为timestr
关键字参数提供了一个默认值,该参数将被视为非法并引发ValueError
datetime
是用C实现的。如果您只想替换构造函数,只要有一个方便的函数来解析字符串就容易多了。谢谢你的建议。最终目标是在比赛结果表中显示时间。出于这个原因,我还想重写\uuu str\uuu
,以使使用漂亮的打印机模块更容易。使用无效默认值的想法是在RaceTimedelta()
的情况下提供更友好的错误消息。我明白了。也许将其更改为def\uuuu new\uuuuu(cls,timestr='no default'):
或添加注释会使事情更清楚(对阅读代码的其他人而言)。
import datetime
import re
class RaceTimedelta(datetime.timedelta):
def __new__(cls, timestr=''):
m = re.match(r'(\d+):(\d+\.\d+)', timestr)
if m:
mins, secs = int(m.group(1)), float(m.group(2))
return super(RaceTimedelta, cls).__new__(cls, minutes=mins, seconds=secs)
else:
raise ValueError('timestr argument not in format "mm:ss.d"')
print RaceTimedelta(u'24:45.7')