将属性添加到datetime.datetime

时间:2014-01-17 17:21:37

标签: python datetime inheritance subclass

我有自己的DateTime,它是datetime.datetime的一个子类:

class DateTime(datetime.datetime):
    def __new__(cls, **kwargs):
        cls.my_attr = kwargs.pop('my_attr')
        return datetime.datetime.__new__(cls, **kwargs)

当我创建一个或多个实例时,每个instance.my_attr指向同一个对象cls.my_attr

>>> dt1 = DateTime(**{'year': 2014, 'month': 1, 'day': 17, 'hour': 18, 'minute': 10, 'my_attr': 'dt1'})
>>> dt1.my_attr
'dt1'
>>> dt2 = DateTime(**{'year': 2015, 'month': 2, 'day': 18, 'hour': 19, 'minute': 11, 'my_attr': 'dt2'})
>>> dt1.my_attr
'dt2'
>>> dt2.my_attr
'dt2'
>>> id(dt1.my_attr)
23429768
>>> id(dt2.my_attr)
23429768
>>> id(DateTime.my_attr)
23429768

怎么了?

1 个答案:

答案 0 :(得分:3)

您正在更改类的attr而不是实例。您应首先创建实例,然后为其分配属性:

class DateTime(datetime.datetime):
    def __new__(cls, **kwargs):
       my_attr = kwargs.pop('my_attr')
       dt = datetime.datetime.__new__(cls, **kwargs)
       dt.my_attr = my_attr
       return dt

测试:

>>> dt1 = DateTime(**{'year': 2014, 'month': 1, 'day': 17, 'hour': 18, 'minute': 10, 'my_attr': 'dt1'})
>>> dt2 = DateTime(**{'year': 2015, 'month': 2, 'day': 18, 'hour': 19, 'minute': 11, 'my_attr': 'dt2'})
>>> dt1.my_attr
'dt1'
>>> dt2.my_attr
'dt2'