如何更改字符串对象中的字符串对象?

时间:2015-06-14 05:38:29

标签: python string object immutability

我试图通过继承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中存储的字符串实际 物理 内容是什么?无论在哪里,我都想指定那里

1 个答案:

答案 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或其他东西直接搞砸内存,否则你无法获得它。如果你搞砸了它,那么奇怪的事情就会破灭,因为对于字符串子类而言,这个数据是不可变的假设是不会被放弃的。