【发布时间】:2018-10-31 17:21:41
【问题描述】:
在给定现有datetime.datetime() 实例的情况下,我需要一种方法来轻松创建datetime.datetime 子类的实例。
假设我有以下人为的例子:
class SerializableDateTime(datetime):
def serialize(self):
return self.strftime('%Y-%m-%d %H:%M')
我正在使用这样的类(但有点复杂),用于 SQLAlchemy 模型;您可以告诉 SQLAlchemy 使用 TypeDecorator class 将自定义类映射到受支持的 DateTime 列值;例如:
class MyDateTime(types.TypeDecorator):
impl = types.DateTime
def process_bind_param(self, value, dialect):
# from custom type to the SQLAlchemy type compatible with impl
# a datetime subclass is fine here, no need to convert
return value
def process_result_value(self, value, dialect):
# from SQLAlchemy type to custom type
# is there a way have this work without accessing a lot of attributes each time?
return SerializableDateTime(value) # doesn't work
我不能在这里使用return SerializableDateTime(value),因为默认的datetime.datetime.__new__() 方法不接受datetime.datetime() 实例:
>>> value = datetime.now()
>>> SerializableDateTime(value)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: an integer is required (got type datetime.datetime)
是否有一种快捷方式可以避免将value.year、value.month 等一直复制到时区到构造函数中?
【问题讨论】:
-
@MartijnPieters 问题是
value已经属于datetime类型,但我无法用另一个datetime对象初始化SerializableDateTime(它实际上从datetime继承__init__) .所以SerializableDateTime(value)以TypeError: an integer is required (got type datetime.datetime)失败 -
这不是 SQLAlchemy 问题,这纯粹是您的自定义类的问题。
-
@MartijnPieters 绝对是,我不怀疑这可能是 sqlalchemy 问题
标签: python datetime inheritance python-datetime