我试图通过继承str(Unlike the answer to this other question)来创建一个可变的字符串对象。
到目前为止,这是我的代码:
class mstr(str):
def __new__(self, s):
self.s = list(s)
return str.__new__(self, s)
def __getitem__(self, index):
return self.s[index]
def __setitem__(self, index, value):
self.s[index] = value
def __eq__(self, other):
return ''.join(self.s) == other
def __ne__(self, other):
return ''.join(self.s) != other
def __lt__(self, other):
return len(self.s) < len(other)
def __gt__(self, other):
return len(self.s) > len(other)
def __le__(self, other):
return len(self.s) <= len(other)
def __ge__(self, other):
return len(self.s) >= len(other)
def __add__(self, other):
return ''.join(self.s) + other
def __mul__(self, other):
return ''.join(self.s) * other
def __hash__(self):
return hash(''.join(self.s))
def __str__(self):
return ''.join(self.s)
def main():
s = mstr("Hello ")
s[5] = " World!"
print(s)
if __name__ == '__main__':
main()
通过输出这个例子,它很容易被__ str __返回值所迷惑:
Hello World!
它很容易被__ add __的返回值所迷惑:
print(s + " Bloody madness!")
输出:
Hello World! Bloody madness!
但是,一旦我们通过__ add __的另一个参数传递mstr本身就会显示不可变的真值,例如:
print(s + s)
输出:
Hello World!Hello
删除所有额外的方法:
class mstr(str):
def __new__(self, s):
self.s = list(s)
return str.__new__(self, s)
def __setitem__(self, index, value):
self.s[index] = value
self = ''.join(self.s) # Foolish attepmt.
印刷品的输出只是&#34;你好&#34;。
那么,如何更改字符串对象中的字符串对象?我的意思是,在str或object中存储的字符串实际和 物理 内容是什么?无论在哪里,我都想指定那里。
答案 0 :(得分:1)
它在here:
typedef struct {
PyObject_VAR_HEAD
long ob_shash;
int ob_sstate;
char ob_sval[1]; // This part. (Not actually one char.)
/* ... */
} PyStringObject;
除非你想用ctypes或其他东西直接搞砸内存,否则你无法获得它。如果你做搞砸了它,那么奇怪的事情就会破灭,因为对于字符串子类而言,这个数据是不可变的假设是不会被放弃的。