python - 你能像字符串替换一样快捷地使用Python方法吗?

标签 python class extend

在Python中,你可以这样说:

s = 'fred loves mary'
r = s.replace
s = r('fred','ben')
print s

...你可以非常方便地得到:

ben loves mary

但是,因为当您说 r = s.replace 时,您创建了一个始终包含“fredlovesmary”的对象,因此不会产生“benlovesdeb”...

s = 'fred loves mary'
r = s.replace
s = r('fred','ben')
s = r('mary','deb')
print s

...相反,它会产生:

fred loves deb

我明白发生了什么。但是能够像后一组那样实际编写快速代码并使其工作,即产生:

ben loves deb

...会很棒。所以我的问题是,除了定义 ObviousFunction(s,x,y) 或类之外,还有其他方法可以做到这一点,即:

class xs:
    def __init__(self,s):
        self.s = s
    def r(self,x,y):
        self.s = self.s.replace(x,y)
    def __str__(self):
        return self.s 


s = xs('fred loves mary')
s = s.r('mary','deb')
s = s.r('fred','ben')
print s

...实际上确实产生:

ben loves deb

...但是对于进一步的字符串操作,需要以下类型的体操:

print s.s.upper()

...

BEN LOVES DEB

我查看了是否有任何扩展现有类(在本例中为 str)的能力,但一无所获。谷歌功能弱吗?

嗯。好的,我到目前为止:

class xs(str)
    def r(self,x,y):
        return xs(self.replace(x,y))

...这将执行此操作:

s = xs('fred loves mary')
s = s.r('fred','ben')
s = s.r('mary','deb')
# so far, so good; s is still class xs and you can go on forever
# but if you do this:
s = s.replace('ben','meezer')
# now s is an object of class str

...那么有什么方法可以将返回值通常强制到原始类,因为我已经强制了 .r() 返回的值?除了说...

s = xs(s)

...之后?

我可以看到,人们可以扩展此类,直到成功包装返回字符串的每种类型的字符串调用,然后将(较大的)结果扔进工具箱中,但这对于看起来像的东西来说是一项艰巨的工作这应该很容易。尽管如此,这可能是唯一的解决方案,如果是这样的话......我肯定会以这样的类(class)结束。除了缩短所有冗长的内容以增加工作/角色因素的好处之外,str 类可以获得的东西还有很多。

感谢您的见解。

最佳答案

好吧,经过这里的所有帮助和一些进一步的网上搜索之后,我得到了一些非常接近我想要的东西。我已经编写了一个更完整的类(class),但以下片段练习了与我最初的查询直接相关的问题:

class xs(str):
    def __add__(self,a):            # OPERATORS
        return xs(str(self) + a)    # +
    def __mod__(self,tup):
        return xs(str(self) % tup)  # %
    def __getslice__(self,b,c):
        return xs(str(self)[b:c])   # [:]

    def r(self,x,y):                # replace, as 'r'
        return xs(self.replace(x,y))

使用上面的内容,可以维护类标识,可以为每个返回字符串的类 str 函数编写替换代码,并且其他一切都可以像处理字符串一样工作。所以...

a = xs('fred loves mary')
a = a.r('fred','ben')
a = a.r('mary','deb')
print a

...结果...

ben loves deb

...还有...

b = a[:3]  # get 'ben'
c = a[-3:] # get 'deb'
d = xs('%s adores %s') # format string
e = d % (b,c) # do the formatting
e = e.r('ben','charlie')
f = e + ' (so I hear)'
print f,str(type(f))

...产量...

charlie adores deb (so I hear)  <class '__main__.xs'>

正如我们所看到的,xs 类始终得到维护,标准操作照常应用。 str 类中任何不返回字符串的内容都可以保持不受干扰;任何发生的事情都应该被处理,因为 .replace() 就在这里。 xs 类的对象几乎可以在字符串可以使用的任何地方使用,并且在许多情况下,字符串可以与 xs 类的对象一起使用而不会引起问题;值得注意的异常(exception)是 + 和 % 的第一个操作数,因为它们必须属于 xs 类,以便运算符覆盖能够首先获取它们。

最好的是能够扩展类str。但对其进行子类化可以提供大部分好处。

如果有人真的感兴趣,我会将完整的类(class)(目前大部分已完成)发布到您可以获取的地方。包括点四弦方便性、类异常(exception)、yadda yadda。在 Python 2.6.1 下运行,需要针对 Python 3 进行额外的工作。

感谢大家的帮助!

关于python - 你能像字符串替换一样快捷地使用Python方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27438729/

相关文章:

Python 文件打开语法

python - 如何从Python中的某些HTML节点仅获取可见文本

python - 在 Python 3 中显示 unicode 字符

java - 你可以在 Java 中扩展 ArrayList 吗?

python - 运行时变量创建 Python 3.1.2

C++ 将参数传递给类的实例

c++ - 如何使用另一个模板化类的实例来对类进行模板化?

c++ - '游戏状态' : base class undefined

python - 将新项目添加到列表中?

c++ - "Extend"C++ 结构