首页 > 解决方案 > 子类化一个复杂对象,并从其父类初始化一个实例

问题描述

在下面的示例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对象。我的问题与这篇文章从 Python 中的基类对象创建对象非常相似。即如何从父对象启动子类。我在帖子中尝试了委托解决方案,但它导致了递归和一些混乱的代码。我在想一定有更好的方法!

标签: pythondatetimesubclass

解决方案


您正在继承该类的整个行为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)

推荐阅读