我有兴趣做一些类似Django对列表所做的事情,例如:
在django壳
In [4]: from TimePortal.models import Rules
In [5]: Rules.objects.all()
Out[5]: [<Rules: day_limit>]我试着做以下几件事:
class TimeEntryList(list):
def __str__(self):
return ';'.join([str(i) for
i in self.__getslice__(0, self.__len__())])它似乎在正常的Python shell中工作:
In [54]: a=TimeEntryList(('1-2','2-3'))
In [58]: print a
1-2;2-3
In [59]: str(a)
Out[59]: '1-2;2-3'但是,在我的应用程序中,TimeEntryList实例实际上是定义如下的TimeEntry对象的列表:
class TimeEntry(object):
def __init__(self, start, end):
self.start = start
self.end = end
#self.duration = (self.end - self.start).seconds / 3600.0
@property
def duration(self):
return (self.end - self.start).seconds / 3600.0
@duration.setter
def duration(self, value):
self._duration = value
def __str__(self):
return '{} - {} '.format(dt.strftime(self.start, '%H:%M'),
dt.strftime(self.end, '%H:%M'),)当我打印一个条目时,一切都很好:
>>> print checker.entries[0]
08:30 - 11:00 当我尝试切片时,结果是不同的:
>>>print self.entries[0:2]
[<TimePortal.semantikCheckers.TimeEntry object at 0x93c7a6c>, <TimePortal.semantikCheckers.TimeEntry object at 0x93d2a4c>]我的问题是:
如何从列表继承,并定义__str__,以便只打印切片,在发出print self.entries[0:2]时输出以下内容
['08:30 - 11:00 ', '11:00 - 12:30 ']我知道这给出了我想要的结果:
[str(i) for i in self.entries[:2]]然而,我在这里的目的是学习一种新技术,而不一定要使用我已经知道的知识。
发布于 2013-08-28 10:38:45
您需要重写__repr__ of TimeEntry (而不是更改列表实现)。您可以在这里找到关于__repr__和__str__之间区别的解释:
https://stackoverflow.com/questions/18485536
复制相似问题