答案 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)