python - 子类化一个复杂对象,并从其父类初始化一个实例
问题描述
在下面的示例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 中的基类对象创建对象非常相似。即如何从父对象启动子类。我在帖子中尝试了委托解决方案,但它导致了递归和一些混乱的代码。我在想一定有更好的方法!
解决方案
您正在继承该类的整个行为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)
推荐阅读
- sql - 无法计算中位数 - SQL Server 2017
- javascript - 当我使用 React Hooks 将一个布尔值从一个子组件传递给它的父组件时,出了什么问题?
- css - 如何解决由于 RoR 应用程序中的 fields_with_error 而导致布局混乱的问题?
- android - Android - adapter.NotifyDataSetChanged 问题
- java - 尝试合并类的排序数组时出现空指针异常
- dax - Power Query - 一旦应用当前年份过滤器,DATEADD 就会失败
- python - 当您从嵌套字典中获得键时,Python/JSON 在字典中获取值?
- node.js - 谷歌云存储 NodeJS getFilesStream 异步
- python - 我的 django 项目中未解决的导入:VSCode
- python - 元组'对象不能被解释为 autopy 中的整数