chr*_*ley 2 python datetime class instance
我正在处理来自应用程序的数据,该应用程序在如何保持时间方面有一些怪癖.一个更简单的怪癖是它使用"一年中的一天"(1月1日是1,2月1日是32等)而不是月份+日.所以我想创建自己的日期类,它继承自默认的datetime类,并且有一些自定义方法.我白天打电话给我.除了输出到我的奇怪格式的方法之外,我还需要将奇怪的格式输入到白天的方法.就像方法.fromordinal()可以从datetime调用一样,我希望有一个方法.fromdayofyear()可以从白天调用.到目前为止我得到了:
import datetime
class daytime(datetime.datetime):
@property
def dayofyear(self):
return (self.date - datetime.date(self.year,1,1)).days + 1
def fromdayofyear(year,dayofyear):
return datetime(year,1,1)+datetime.timedelta(dayofyear-1)
Run Code Online (Sandbox Code Playgroud)
问题是,由于fromdayofyear是一个类,它需要一个白天实例来执行任何方法.
>>> from utils import daytime
>>> day = daytime.fromdayofyear(2010,32) #should give a datetime, Feburary first
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method from_datetime() must be called with DayTime instance as first argument (got str instance instead)
>>>
Run Code Online (Sandbox Code Playgroud)
我可以很容易地编写一系列函数来做到这一点,但是这使得开始创建自定义类失败了.我意识到我可能不应该在这里使用课程.有人能指出我正确的方向吗?
编辑:
这就是我所确定的:
import datetime
class daytime(datetime.datetime):
@property
def dayofyear(self):
return (self.date - datetime.date(self.year,1,1)).days + 1
@classmethod
def fromdayofyear(cls,year,dayofyear):
dt = cls(year,1,1)+datetime.timedelta(dayofyear-1)
return cls(dt.year,dt.month,dt.day)
Run Code Online (Sandbox Code Playgroud)
你想要@classmethod装饰.然后你的方法获取类而不是对象实例作为第一个参数.习惯上称它为cls:
@classmethod
def from_file(cls, f):
return cls(f.read())
Run Code Online (Sandbox Code Playgroud)