小能豆

Python/IPython shell 中的对象字符串表示

py

它返回一个丑陋的机器人友好字符串:

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。我尝试使用unicodestr,就像在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 类显示对用户有用的东西?


阅读 25

收藏
2024-11-27

共1个答案

小能豆

要让你的 Python 类实例在被打印(或在 IPython 中显示)时显示对用户有用的信息,可以实现类的 __str____repr__ 方法。以下是两者的区别:

  1. __str__:定义对象在被 str() 调用或通过 print() 打印时的字符串表示。它主要面向用户。
  2. __repr__:定义对象的官方字符串表示,用于调试和开发。通常应返回一个明确且准确的字符串,优先在 IPython 或 REPL 中显示。

在你的示例中,可以修改 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)"(开发者友好)

输出结果

  1. 当通过 print(m) 调用:
    plaintext 01-31-2010

  2. 当在 IPython 或交互式环境中查看变量时:
    plaintext Month(2010-01-31)

关键改动

  1. __str__ 返回用户友好的日期格式:MM-DD-YYYY
  2. __repr__ 返回开发者友好的字符串,显示类名和日期的标准格式 YYYY-MM-DD

通过这种方式,Month 实例在用户和开发者视角下都能直观理解,同时不失调试时的可用性。

如果你希望在 IPython 中默认显示为用户友好的格式(而不是 __repr__),可以覆盖 __repr__ 并让它与 __str__ 返回一致的字符串。

2024-11-27