它返回一个丑陋的机器人友好字符串:
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中一样,没有成功:
m
1-31-2010
unicode
str
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 类显示对用户有用的东西?
d
要让你的 Python 类实例在被打印(或在 IPython 中显示)时显示对用户有用的信息,可以实现类的 __str__ 和 __repr__ 方法。以下是两者的区别:
__str__
__repr__
str()
print()
在你的示例中,可以修改 Month 类如下:
Month
from datetime import date from calendar import monthrange class Month: def __init__(self, dateobj): self.dateobj = dateobj def __str__(self): # 返回用户友好的字符串 return self.dateobj.strftime("%m-%d-%Y") def __repr__(self): # 返回开发者友好的字符串 return f"Month({self.dateobj.strftime('%Y-%m-%d')})" @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 = date(2010, 1, 31) m = Month(d) print(m) # 输出 "01-31-2010"(用户友好) print(repr(m)) # 输出 "Month(2010-01-31)"(开发者友好)
当通过 print(m) 调用: plaintext 01-31-2010
print(m)
plaintext 01-31-2010
当在 IPython 或交互式环境中查看变量时: plaintext Month(2010-01-31)
plaintext Month(2010-01-31)
MM-DD-YYYY
YYYY-MM-DD
通过这种方式,Month 实例在用户和开发者视角下都能直观理解,同时不失调试时的可用性。
如果你希望在 IPython 中默认显示为用户友好的格式(而不是 __repr__),可以覆盖 __repr__ 并让它与 __str__ 返回一致的字符串。