在python中创建一个Mutable字符串类

时间:2015-07-08 11:45:28

标签: python string class inheritance mutable

我正在尝试在python中创建一个具有所有str特征的类,但也是可变的。

示例:

>>> a = mutableString("My string")
>>> print a +"c"
"My stringc"
>>> a[0] = "a"
>>> a
"ay string"

如何通过继承str

来实现

编辑: 到目前为止我所做的是:

class mutableString(object):
    def __init__(self, string):
        self.string = string
    def __setitem__(self, item, value):
        self.string = self.string[:item] + value + self.string[item + len(value):]
        print type(self.string)
    def __repr__(self):
        return self.string

在这种情况下,我可以这样做:

a = mutableString("aaa")
a[2] = "b"
print a
#prints aab

但我不能这样做:

print a + "c"
#unsupported operand type(s) for +: 'mutableString' and 'str'

所以,我要做的是创建一个保持str特征的类,但允许我设置。

5 个答案:

答案 0 :(得分:0)

我相信这会提供您想要的功能:

    class mutableString():
        def __init__(self,string):
            self.string = list(string)
        def concat(self,pos,notherstr): #pos is so you can concatenate where you want!
            self.string[pos] = self.string[pos] + notherstr
            return "".join(self.string) 
        def changestr(self,pos,notherstr):
            self.string[pos] = notherstr
            return "".join(self.string)

然后你可以打电话给你的班级,当然我没有处理可能弹出的错误(例如放入一个大于列表长度的pos)所以我会把它留给你。

现在你可以说:

    a = mutableString("Hello")
    a.concat(4,'a')  #Output: "Helloa"
    a.changestr(4,'d') #"Helld"

答案 1 :(得分:0)

你想要的内容已经作为Python内置存在:它是bytearray类。 https://docs.python.org/2/library/functions.html#bytearray

答案 2 :(得分:0)

不全面,但是这里是使用相同setitem方法的更完整的可变字符串类。我把减法运算符扔进去很有趣。 :) 您可以继续以相同的模式创建字符串类中所需的函数,然后在self.string上调用该函数,并返回包装在mystring()类中的函数以返回可变字符串类而不是python字符串类。
string class

该程序的输出为: '' 'foobar' 'foobarfoobarfoobarfoobar' 'foobarfoobarfoo' 'foofoofoo' 'foofoof' 'foobarfoof' 'boobarfoof'

玩得开心!

答案 3 :(得分:0)

首先,您需要覆盖__add__,以便a + "c"起作用:

def __add__(self, other):
    if isinstance(other, mutableString):
        return mutableString(self.string + other.string)
    elif isinstance(other, str):
        return mutableString(self.string + other)
    else:
        raise NotImplemented

但是,您还需要实现__radd__,以便"c" + a也能正常工作; str.__add__("c", a)将引发NotImplemented,从而触发对mutableString.__radd__(a, "c")的呼叫。

def __radd__(self, other):
    return self + other  # which simply invokes mutableString.__add__

从本质上讲,您需要覆盖一切 str支持以提供类似的API。首先,您正确地不是str继承,因为那不会让您突然将值视为可变的。

答案 4 :(得分:0)

您可以添加特殊方法_ add _来代替定义concat和all之类的函数 上课。

class Str(object):
def __init__(self, string):
    self.string = string
def __setitem__(self, item, value):
    if item<0: item=item+len(self.string)
    self.string = self.string[:item] + value + self.string[item + len(value):]
def __add__(self,value,/):
    return self.string + value
def __repr__(self):
    return self.string

我在两个地方修改了https://stackoverflow.com/users/4218896/jfish003的代码

  • 首先使用_ setitem _方法,以使负索引起作用
  • 第二,我编写了_ add _方法来连接字符串