子类化一个复杂的对象,并从其父类初始化一个实例

问题描述 投票:0回答:1

在以下示例中为Foo类(试图制作具有额外方法的datetime类)。我还希望能够链接方法调用(例如foo.bar().baz()),以及能够将该对象传递给需要datetime对象的现有函数。

实例化时得到如下所示的TypeError

from pytz import UTC
from datetime import datetime

class Foo(datetime):
    def bar(self, timezone):
        print(self.astimezone(timezone))            
        return self

now = datetime.now(UTC)
Foo(now) # TypeError: an integer is required (got type datetime.datetime)

我猜测错误是由于试图从datetime对象制作datetime对象而引起的。我的问题与这篇文章Creating an object from a base class object in Python非常相似。即如何从父对象发起子类。我在帖子中尝试了委派解决方案,但导致递归和一些混乱的代码。我认为必须有更好的方法!

python datetime subclass
1个回答
1
投票

您正在继承datetime类的整个行为。构造函数的行为与datetime构造函数相同,这意味着它期望整数年,月,日等。 datetime(datetime.now())由于相同的原因将以相同的方式失败。

您可以简单地使用Foo.now()使用Foo机制来构造datetime.now()实例。

如果要将现有的datetime对象“增强”到Foo对象,则可能应该为此添加一个类方法:

class Foo(datetime):
    @classmethod
    def from_datetime(cls, dt):
        return cls.fromtimestamp(dt.timestamp(), dt.tzinfo)

将现有的datetime对象转换为时间戳并在此处使用fromtimestamp构造函数可能是复制所有所需信息的最简单方法。使用方式:

foo = Foo.from_datetime(now)
© www.soinside.com 2019 - 2024. All rights reserved.