【问题标题】:subclassing Python's datetime.time继承 Python 的 datetime.time
【发布时间】:2013-08-02 07:31:09
【问题描述】:

无论出于何种原因,我想继承 datetime.time 以便子类可以由另一个 datetime.time 对象初始化。遗憾的是,这不起作用:

class MyTime(datetime.time):
    def __init__(self, t):
        super().__init__(t.hour, t.minute, t.second, t.microsecond)

>>> t=datetime.time(10,20,30,400000)
>>> MyTime(t)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: an integer is required

显然我在做一些愚蠢的事情,但这是什么?

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:
    1. super() 在 Python 2.x 中无法正常工作。您想改用super(MyTime, self)

    2. 在这种情况下,您必须覆盖 __new__ 而不是 __init__

      class MyTime(datetime.time):
          def __new__(cls, t):
              return datetime.time.__new__(cls, t.hour, t.minute, t.second, t.microsecond)
      
      print MyTime(datetime.time(10,20,30,400000))
      

      打印

      10:20:30.400000
      

    【讨论】:

    • 从理论上讲 - 我应该什么时候覆盖 new,什么时候应该覆盖 init
    • @r0u1i __new__ 当你的子类使用 __new__ 进行自己的初始化时,__init__ 如果它使用 init。我认为您必须进行测试; AFAIK 对此没有固定规则(但它往往在 C 类中更频繁地发生......)
    • 是的,没有简单的方法可以判断。一个类可以使用__new__ 使两个不同的创建对象具有相同的id(实际上不调用object.__new__,而是返回一些现有对象),但这只有在底层数据真正不可变的情况下才能正常工作。 (例如,小的ints 具有相同的id,因此id(3) == id(3) 始终为True,因为ints 是不可变的。)但是datetime.time 对象不共享ID,我相信,所以它可能只是他们使用__new__的历史事故。
    • 我们如何使这个解决方案与copy(MyTime(t)) 一起工作?目前它会引发错误,即使我重新定义__copy__
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 2018-05-21
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多