Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何扩展datetime.timedelta?_Python_Datetime - Fatal编程技术网

Python 如何扩展datetime.timedelta?

Python 如何扩展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

我正在尝试扩展Python
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')