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

时间:2016-02-09 15:17:27

标签: python django python-3.x unicode ipython

我有一个友好的月课我很喜欢,它返回一个丑陋的机器人友好的字符串:

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类显示对用户有用的东西? Terima kasih

3 个答案:

答案 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")

输出日期对象的详细信息