我有兴趣做类似于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]]
然而,我的目的是学习一种新技术,而不一定与我已经知道的一起工作。
答案 0 :(得分:5)
您需要覆盖__repr__
的{{1}}(而不是更改列表实现)。您可以在此处找到有关TimeEntry
和__repr__
之间差异的说明: