你可以快捷方式像字符串替换python方法吗?

时间:2014-12-12 07:21:05

标签: python class extend

在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可以获得的东西数量很多,除了缩短所有单词的好处,所以工作/角色因素增加。

感谢您的任何见解。

3 个答案:

答案 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()