我正在尝试在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
特征的类,但允许我设置。
答案 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的代码