我正在处理来自应用程序的数据,该应用程序在计时方面有一些怪癖。一个更简单的怪癖是它使用“一年中的第几天”(1 月 1 日是 1,2 月 1 日是 32,等等)而不是月 + 日。所以我想制作自己的日期类,它继承自默认日期时间类并具有一些自定义方法。我在白天打电话。除了输出到我的奇怪格式的方法之外,我还需要将奇怪格式输入到白天的方法。就像方法 .fromordinal() 可以从日期时间调用一样,我想要一个方法 .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)
问题是因为 fromdayofyear 是一个类,它需要一个 daytime 的实例来执行任何方法。
>>> 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)
>>>
我可以轻松地编写一系列函数来执行此操作,但这违背了创建自定义类的初衷。我意识到我可能不应该在这里使用类(class)。有人可以指出我正确的方向吗?
编辑:
这是我的决定:
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)
最佳答案
你需要@classmethod 装饰器。然后你的方法获取类而不是对象实例作为第一个参数。习惯上叫它cls:
@classmethod
def from_file(cls, f):
return cls(f.read())
关于python - python 中的自定义类 : does a method HAVE to be called with an instance?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3552045/