在Python中,您可以这样说:
s = 'fred loves mary'
r = s.replace
s = r('fred','ben')
print s
......你很轻松地得到了:
ben loves mary
然而,因为当你说r = s.replace你创建了一个总是包含'fred loves mary'的对象时,这不会产生“ben loves deb”......
s = 'fred loves mary'
r = s.replace
s = r('fred','ben')
s = r('mary','deb')
print s
......相反,它会产生:
fred loves deb
我明白发生了什么。但实际编写快速代码的能力就像后者一样,并使其有效,即产生:
ben loves deb
...将 awesome 。所以我的问题是,有没有办法做到其他而不是定义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可以获得的东西数量很多,除了缩短所有单词的好处,所以工作/角色因素增加。
感谢您的任何见解。
答案 0 :(得分:1)
好的,在这里得到所有的帮助以及一些关于网络的进一步拖曳之后,我有一些非常接近我想要的东西。我写了一个更完整的课程,但以下片段解决了与我原始查询直接相关的问题:
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的对象一起使用而不会引起问题;值得注意的例外是+和%的第一个操作数,因为这些操作数必须是类xs,以便操作符覆盖首先获取它们。
最好的是扩展类str的能力。但是对它进行子类化提供了大部分好处。
如果有人真正感兴趣,我会发布完整的课程(目前大部分都是完整的),你可以抓住它。包括点缀四字符串轻松,类异常,yadda yadda。在Python 2.6.1下运行,需要为Python 3做额外的工作。
感谢大家的帮助!
答案 1 :(得分:0)
你只需要做一些更难编码:
s = 'fred loves mary'
s = s.replace('fred','ben')
s = s.replace('mary','deb')
print s
输出:
ben loves deb
答案 2 :(得分:0)
我希望以下代码可以帮助您,我正在使用python 2.7
class xs(object):
def __init__(self,s):
self.s = s
def r(self,x,y):
self.s = self.s.replace(x,y)
return self
def __getattr__(self, name ):
return getattr(self.s, name)
def __str__(self):
return self.s
s = xs('fred loves mary')
s = s.r('mary','deb')
s = s.r('fred','ben')
print s
print s.upper()