首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >继承Python并覆盖__str__

继承Python并覆盖__str__
EN

Stack Overflow用户
提问于 2013-08-28 10:35:38
回答 1查看 2.6K关注 0票数 0

我有兴趣做一些类似Django对列表所做的事情,例如:

在django壳

代码语言:javascript
复制
In [4]: from TimePortal.models import Rules

In [5]: Rules.objects.all()
Out[5]: [<Rules: day_limit>]

我试着做以下几件事:

代码语言:javascript
复制
class TimeEntryList(list):

    def __str__(self):
        return ';'.join([str(i) for
                        i in self.__getslice__(0, self.__len__())])

它似乎在正常的Python shell中工作:

代码语言:javascript
复制
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对象的列表:

代码语言:javascript
复制
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'),)

当我打印一个条目时,一切都很好:

代码语言:javascript
复制
>>> print checker.entries[0]
08:30 - 11:00 

当我尝试切片时,结果是不同的:

代码语言:javascript
复制
>>>print self.entries[0:2]
[<TimePortal.semantikCheckers.TimeEntry object at 0x93c7a6c>, <TimePortal.semantikCheckers.TimeEntry object at 0x93d2a4c>]

我的问题是:

如何从列表继承,并定义__str__,以便只打印切片,在发出print self.entries[0:2]时输出以下内容

代码语言:javascript
复制
['08:30 - 11:00 ', '11:00 - 12:30 ']

我知道这给出了我想要的结果:

代码语言:javascript
复制
[str(i) for i in self.entries[:2]]

然而,我在这里的目的是学习一种新技术,而不一定要使用我已经知道的知识。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-28 10:38:45

您需要重写__repr__ of TimeEntry (而不是更改列表实现)。您可以在这里找到关于__repr____str__之间区别的解释:

in Python

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18485536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档