当前位置: 首页 > 知识库问答 >
问题:

子类化datetime时的奇怪行为。时间差

严永丰
2023-03-14

为了方便起见,我想创建datetime的子类。时间三角洲。这样做的目的是定义一个类:

class Hours(datetime.timedelta):
    def __init__(self, hours):
        super(Hours, self).__init__(hours=hours)

所以我可以快速创建这样的时间增量:

x = Hours(n)

然而,上面的代码产生了n天而不是n小时的时间增量。例如,请看以下ipython会话:

In [1]: import datetime

In [2]: class Hours(datetime.timedelta):
   ...:     def __init__(self, hours):
   ...:         super(Hours, self).__init__(hours=hours)
   ...:         

In [3]: print(Hours(10))
Out[3]: 10 days, 0:00:00

我无法解释这一点。有人吗?

共有1个答案

方璞
2023-03-14

如果使用\uuuuu new\uuuu,而不是\uuuuu init\uu

import datetime as DT
class Hours(DT.timedelta):
    def __new__(self, hours):
        return DT.timedelta.__new__(self, hours=hours)
x = Hours(10)
print(x)

产量

10:00:00

如果重写__init__,但不重写__new__,则DT. timedelta.__new__会在小时之前被调用。__init__。通知

import datetime as DT
class Hours(DT.timedelta):
    def __init__(self, hours):
        print(self)

x = Hours(10)

打印10天,0:00:00。这表明DT。时间三角洲__new_已经将timedelta设置为10天,您甚至还没有机会在小时内配置它__初始化_

而且,DT。timedelta是一个不可变的对象——在对象被实例化后,不能更改微秒。Python使用\uuuuu new\uuu方法创建不可变对象,并且通常不在\uuuu init\u方法中执行任何操作。可变对象的作用正好相反:它们在\uuuu init\uuu中配置对象,而在\uuu new\uuu中不执行任何操作。

根据文档:

当子类化不可变的内置类型(如数字和字符串)时,偶尔在其他情况下,静态方法__new__会派上用场。__new__是实例构建的第一步,在__init__之前调用。调用__new__方法时将类作为其第一个参数;它的职责是返回该类的新实例。将此与__init__进行比较:__init__以实例作为其第一个参数调用,并且它不返回任何内容;它的职责是初始化实例......

所有这些都是为了使不可变类型能够在允许子类化的同时保持其不可变性。

(如果不可变对象在\uuuuu init\uuu中执行配置,那么您可以通过调用不可变来变异不可变对象。uuuu init\uuuu。显然,我们不希望这样,所以不可变。uuuu init\uuuu通常不做任何事情。)

另外请注意,除非您计划向Hours类添加新方法,否则只使用函数会更简单,因此更好:

def hours(hours):
    return DT.timedelta(hours=hours)
 类似资料:
  • 我正在使用Mapstruct映射将一个POJO转换为另一个POJO模型 以下是mapstruct自动生成的方法 该方法基本上获取源POJO的映射,并将其转换为目标模型的映射。生成正在通过。 当我运行代码时,我在这个方法中得到了ClassCast异常:HeaderAttributeGenericDataTypeMaptoStringEnergiectAttributeDataMap 堆栈跟踪: 我还

  • 我有以下代码: 假设我现在将电脑的时区设置为太平洋时间(PDT为UTC-7),则打印 2012年6月29日星期五08:15:00太平洋标准时间 PDT不是比IST(印度标准时间)晚12.5小时吗?这个问题在任何其他时区都不会发生-我尝试了UTC、PKT、MMT等,而不是日期字符串中的IST。Java中有两个IST吗? 注意:实际代码中的日期字符串来自外部源,因此我不能使用GMT偏移量或任何其他时区

  • 为什么在比较Jython中相同值的Java整数和Python整数时会出现以下行为? 好吧,我觉得这两个

  • 问题内容: 我了解由于数值误差(例如,以不同顺序对浮点求和),在数学上等效的算术运算如何导致不同的结果。 但是,令我惊讶的是,将零加到可以更改结果。我认为无论哪种情况,这对于浮动广告始终有效。 这是一个例子。我希望所有行都完全为零。有人可以解释为什么会这样吗? 和的较小值似乎不会发生Z。 我也确定。 这是另一个示例,它还演示了python的内置行为符合预期: 我正在使用numpy V1.9.2。

  • 我构建了一个小函数来将TimeStamp转换成LocalDate,并偶然发现了奇怪的行为。下面是代码: 我当地的时区是欧洲/柏林。现在,当调用时间戳0时,我得到正确的结果: 一切如期而至。但当我把它命名为第一年的日期时,它辜负了我的期望: 问题: 转换为Instant后缺少一天,所以UTC和欧洲/柏林的时区似乎在当时相隔一天加一小时

  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方