在以下示例中为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非常相似。即如何从父对象发起子类。我在帖子中尝试了委派解决方案,但导致递归和一些混乱的代码。我认为必须有更好的方法!
您正在继承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)