python - python 中的自定义类 : does a method HAVE to be called with an instance?

标签 python datetime class instance

我正在处理来自应用程序的数据,该应用程序在计时方面有一些怪癖。一个更简单的怪癖是它使用“一年中的第几天”(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/

相关文章:

bash - 我如何从 unix 中的给定日期获取最后一个星期日日期

c++ - 可以从方法中调用类构造函数吗?

jquery - 使用 jQuery 访问具有多个类的元素

python - 在 python 中使用 matplotlib 制作自定义颜色图

c# - Datetime.Now.Millisecond 不显示完整时间格式

python - Tensorflow GradientDescentOptimizer - 它如何连接到 tf.Variables?

三位数小时的 Python 时间格式

class - 在 Scala 中,你能创建一个带有引用其他类或特征的变量的实例吗?

python - 如何强制 Python 字典缩小?

python - 在 Python 中解压字节值