str.join与我的类型

时间:2011-10-12 08:35:14

标签: python string inheritance override

是否有机会使用以下方式加入我的类型:

str.join()

我有我的班级:

class Slice(object):
    def __init__(self, start, end):
        self.__start = start
        self.__end = end

    def __str__(self):
        return '{0}:{1}'.format(self.__start, self.__end)

    def __repr__(self):
        return "'{}'".format(str(self))

我应该覆盖什么来执行这种代码:

','.join(Slice(1, 2), Slice(3, 4))

得到这样的结果:

'1:2,3:4'

3 个答案:

答案 0 :(得分:7)

没有

','.join(str(x) for x in (Slice(1, 2), Slice(3, 4)))

答案 1 :(得分:0)

我总是这样做:

','.join(map(str, (Slice(1, 2), Slice(3, 4)))

但你也可以创建一个效用函数:

def strseq(*args):
    for arg in args:
        yield str(arg)
','.join(strseq(Slice(1, 2), Slice(3, 4)))

我认为这是故意的,通常是一件好事:Python是严格打字的,会在运行时抖掉一些愚蠢的错误。因此,请勿尝试将Slice设为str,而应将map改为str

如果你真的想要发黑,请执行以下操作:

class Slice(str):
    def __init__(self, start, end):
        self.__start = start
        self.__end = end
        str.__init__('{0}:{1}'.format(self.__start, self.__end))

我一直收到错误“TypeError:str()最多需要1个参数(2个给定)”当我在构造函数中调用str.__init__(self, 'test')时,这通常是正确的方法,我认为,所以这是一个好兆头,你不应该是str的子类。但是继续吧。用脚射击自己。这很伤人,但是以一种老式的学习方式 - 一天一新的方式:)

答案 2 :(得分:0)

只是为了它,我决定不使用任何迭代函数来调用str(x)。所以这是我的解决方案

x=(Slice(1, 2), Slice(3, 4))
','.join(['%s']*len(x)) % x