0

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 シェルで動作するようです:

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]]

しかし、ここでの私の目的は新しい技術を学ぶことであり、必ずしも私がすでに知っていることで作業するわけではありません.

4

1 に答える 1

5

(リストの実装を変更する代わりに)__repr__をオーバーライドする必要があります。とTimeEntryの違いについては、次の説明を参照してください。__repr____str__

Python の __str__ と __repr__ の違い

于 2013-08-28T10:38:45.160 に答える