python中的自定义类:是否可以使用实例调用方法?

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)

Rad*_*ski 8

你想要@classmethod装饰.然后你的方法获取类而不是对象实例作为第一个参数.习惯上称它为cls:

@classmethod
def from_file(cls, f):
    return cls(f.read())
Run Code Online (Sandbox Code Playgroud)