簡體   English   中英

從Python繼承並覆蓋__str__

[英]Inherit from Python's and override __str__

我對做類似Django對列表的操作感興趣,例如:

在Django Shell中

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__的區別的解釋:

__str__和__repr__在Python中的區別

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM