在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/