Python/IPython shell 中的对象字符串表示
Object string representation in Python/IPython shell
我有一个友好的月份class我喜欢return这是一个丑陋的机器人友好字符串:
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 return 不匹配。我会为此打开一个单独的问题。如何让我的 python classes 显示对用户有用的内容? Terima kasih
你的真正的问题是Python3shell和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__
。
What purpose is __str__
nowadays then?
并不是说 __repr__
替换了 Python 3 中的 __str__
或其他任何东西,而是 __str__
只是 returns 对象的可读表示,而 __repr__
是一个更完整的明确表示(到你甚至可以从 __repr__
输出重建对象的程度)
我相信您可以将月份的 str 更改为:
def __str__(self):
return self.dateobj.strftime("%m/%d/%y")
所以它会访问日期对象并以你想要的格式输出它
编辑:此外,正如已经发布的那样,您可以制作 repr 方法并使其指向 str 这样您总是可以获得相同的格式
def __str__(self):
return self.dateobj.strftime("%Y-%m-%d")
尽管您已经可以通过 d.strftime("%Y-%m-%d")
输出日期对象的详细信息
我有一个友好的月份class我喜欢return这是一个丑陋的机器人友好字符串:
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 return 不匹配。我会为此打开一个单独的问题。如何让我的 python classes 显示对用户有用的内容? Terima kasih
你的真正的问题是Python3shell和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__
。
What purpose is
__str__
nowadays then?
并不是说 __repr__
替换了 Python 3 中的 __str__
或其他任何东西,而是 __str__
只是 returns 对象的可读表示,而 __repr__
是一个更完整的明确表示(到你甚至可以从 __repr__
输出重建对象的程度)
我相信您可以将月份的 str 更改为:
def __str__(self):
return self.dateobj.strftime("%m/%d/%y")
所以它会访问日期对象并以你想要的格式输出它 编辑:此外,正如已经发布的那样,您可以制作 repr 方法并使其指向 str 这样您总是可以获得相同的格式
def __str__(self):
return self.dateobj.strftime("%Y-%m-%d")
尽管您已经可以通过 d.strftime("%Y-%m-%d")