可以子类化不可变日期类并重写__str__方法吗?

-1 投票
2 回答
576 浏览
提问于 2025-04-16 18:43

我正在尝试在Python中创建一个不可变的date类的子类,但我还需要重写__str__方法。到目前为止,我有以下代码:

from datetime import date

class Year(date):
    def __new__(cls, year):
        return super(Year, cls).__new__(cls, year, 1, 1)
    def __str__(self):
        return self.strftime('%Y')

构造函数工作得很好,但当我尝试打印这个对象时,__str__方法完全被忽略了。我看到了一些关于其他不可变类,比如intfloat的子类示例,它们都使用了相同的方式。我是不是漏掉了什么?date对象有什么特别之处吗?

更新:

看起来代码没有问题。我是在Django模板中尝试打印一个Year对象,由于Django使用可本地化的格式来格式化date对象,所以__str__方法被忽略了。

2 个回答

1

如果这是你完整的代码,那你缺少了一个返回语句:

def __str__(self):
    return self.strftime('%Y')
2

__str__ 方法里加一个 return


更新:

我在我的电脑上运行了你 更新过的 代码,结果运行得很好:

aj@localhost:~/so/python# cat date2.py
from datetime import date

class Year(date):
    def __new__(cls, year):
        return super(Year, cls).__new__(cls, year, 1, 1)
    def __str__(self):
        return self.strftime('%Y')

y=Year(2011)
print str(y)
aj@localhost:~/so/python# python date2.py
2011

撰写回答