【问题标题】:Creating a Mutable string class in python在python中创建一个可变字符串类
【发布时间】:2015-07-08 11:45:28
【问题描述】:

我正在尝试在 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 特征,但允许我设置项。

【问题讨论】:

  • str 即使你从它继承,它仍然是不可变的。我认为从 str 继承不会对您有所帮助。
  • 从列表继承并覆盖函数以使其更像字符串似乎是一种更好的方法。
  • 你为什么要这样做?
  • 你必须先了解mutable-immutable的概念。 This question 会帮助你一些。但基本上,可变对象使用它们的内存地址引用并在对象的值发生变化时更新该内存块上存储的对象。当一个不可变对象发生变化时,一个新的内存块被分配并更新结果存储在那里,对象开始使用新的内存块,放弃旧的。 字符串是不可变的,任何从 str 派生的类也是不可变的。
  • Mutable strings in Python的可能重复

标签: python string class inheritance mutable


【解决方案1】:

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

    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"

【讨论】:

    【解决方案2】:

    不全面,但这里有一个更完整的可变字符串类,使用相同的 setitem 方法。为了好玩,我加入了减法运算符。 :) 您可以继续使用相同的模式在字符串类中创建所需的函数,并在 self.string 上调用该函数并返回包装在 mystring() 类中的函数以返回可变字符串类而不是 python 字符串类.
    string class

    程序的输出是: '' 'foobar' 'foobarfoobarfoobarfoobar' 'foobarfoobarfoo' 'foofoofoo' 'foofoof' 'foobarfoo' 'boobarfoof'

    玩得开心!

    【讨论】:

    • 欢迎来到 SO。如果你给出明确的代码,它可能会有所帮助。
    【解决方案3】:

    首先,您需要覆盖 __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】:

      您可以添加特殊方法_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_ 方法来连接字符串

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-04-28
          • 1970-01-01
          • 2019-12-02
          • 1970-01-01
          • 1970-01-01
          • 2012-06-06
          • 2012-12-29
          相关资源
          最近更新 更多