[英]How to Override a Python class's __str__ method on construction with argument?
[英]Inherit from Python's and override __str__
我對做類似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]]
但是,我在這里的目的是學習一種新技術,並不一定要與我已經知道的知識一起工作。
您需要重寫TimeEntry
__repr__
(而不是更改列表實現)。 您可以在此處找到有關__repr__
和__str__
的區別的解釋:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.