时间:2010-07-23 13:03:46

标签: python datetime subclass

5 个答案:

答案 0 :(得分:15)

有点晚了,但以下工作:

import ctypes as c

_get_dict = c.pythonapi._PyObject_GetDictPtr
_get_dict.restype = c.POINTER(c.py_object)
_get_dict.argtypes = [c.py_object]

import datetime

def millisecond(td):
    return (td.microsecond / 1000)
d = _get_dict(datetime.datetime)[0]
d['millisecond'] = millisecond

now = datetime.datetime.now()
print now.millisecond(), now.microsecond

基本上,你使用ctypes获取类字典的可编辑副本,然后只需将你的方法放入。我只使用它来将函数反向移植到较旧的python版本,我认为这是相当干净的。例如:

from datetime import timedelta
try:
    timedelta.total_seconds # new in 2.7
except AttributeError:
    def total_seconds(td):
        return float(td.days * 24 * 3600 + td.seconds + td.microseconds / 1e6)
    d = _get_dict(timedelta)[0]
    d['total_seconds'] = total_seconds
    # works now in 2.4

答案 1 :(得分:3)

答案 2 :(得分:3)

答案 3 :(得分:2)

unutbu与您最初的要求非常接近:

class DateTime(datetime.datetime):
    @property
    def millisecond(self):
        return self.microsecond/1000.0

datetime.datetime = DateTime

我使用此模式来实现在3.1或3.2中工作时仅显示在3.3中的API。班上的其他人一如既往地保持正常工作,没有任何性能损失。

编辑添加:这仅适用于内置的2.6+,因为它仅适用于新式类。 Builtins是旧式的,直到2.6。

答案 4 :(得分:-1)