我有一个友好的月课我很喜欢,它返回一个丑陋的机器人友好的字符串:
In [3]: d = date(2010, 1, 31)
In [4]: m = Month(d)
In [5]: m
Out[5]: <dfa.date_range.Month at 0x7fb4d5793cc0>
我希望m
显示1-31-2010
之类的内容。我尝试使用unicode
和str
,就像在django中一样,没有骰子:
class Month(object):
def __init__(self, dateobj):
self.dateobj = dateobj
# def __unicode__(self):
# return self.dateobj
def __str__(self):
return self.dateobj
@property
def first_day(self):
return self.dateobj.replace(day = 1)
@property
def last_day(self):
_, days_in_month = monthrange(self.dateobj.year, self.dateobj.month)
return self.dateobj.replace(day = days_in_month)
def date_range(self):
return self.first_day, self.last_day
对于d
对象,它没有实现unicode,但有字符串。 str
和ipython返回不匹配。我将为此单独提出一个问题。如何让我的python类显示对用户有用的东西? Terima kasih
答案 0 :(得分:1)
你的真正的问题是Python 3 shell和IPython都会在你的对象上调用repr
NOT str
。这是一个可以看到的片段:
In [1]: class Car(object):
...: def __str__(self):
...: return 'car str'
...: def __repr__(self):
...: return 'car repr'
...:
In [2]: car = Car()
In [3]: car
Out[3]: car repr
如果没有定义__repr__
,IPython只会在<__main__.Car at 0x7f05841b1350>
之前输出内容而不是回退到__str__
。
除非你是明确调用str(car)
或print(car)
,其中将使用__str__
。
因此,您应该在对象中定义__repr__
。
现在
__str__
的目的是什么?
并不是__repr__
替换Python 3中的__str__
或任何东西,但__str__
只返回对象的可读表示,而__repr__
是更完整的明确表示(甚至可以从__repr__
输出重建对象)
答案 1 :(得分:0)
我相信您可以将Month的 str 更改为:
def __str__(self):
return self.dateobj.strftime("%m/%d/%y")
因此它将访问日期对象并以您想要的格式输出它 编辑:另外,如上所述,您可以制作 repr 方法,只需指向 str ,这样您就可以获得相同的格式
答案 2 :(得分:0)
def __str__(self):
return self.dateobj.strftime("%Y-%m-%d")
虽然您已经可以按d.strftime("%Y-%m-%d")