首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python使用用户定义的字符串类

Python使用用户定义的字符串类
EN

Stack Overflow用户
提问于 2014-01-02 22:18:45
回答 1查看 578关注 0票数 0

我知道如何用以下命令重写string类:

代码语言:javascript
复制
class UserString:
    def __str__(self):
        return 'Overridden String'

if __name__ == '__main__':
    print UserString()

但是,在没有隐式定义UserString类的情况下,如何使用这个类来代替内置的str类呢?需要说明的是,我想要:

代码语言:javascript
复制
>>> print "Boo boo!"
Overridden String
EN

回答 1

Stack Overflow用户

发布于 2014-01-02 22:41:14

如果不破解python可执行文件本身,就不可能做你想做的事情……毕竟,str是一种内置类型,当传递'string'类型时,解释器将立即创建内置字符串。

然而..。使用委托,可以做这样的事情。这是对另一个堆栈溢出配方的稍微修改(遗憾的是,我没有在代码中包含指向它的链接……),所以如果这是您的代码,请随意声明:)

代码语言:javascript
复制
def returnthisclassfrom(specials):
  specialnames = ['__%s__' % s for s in specials.split()]
  def wrapit(cls, method):
    return lambda *a: cls(method(*a))
  def dowrap(cls):
    for n in specialnames:
      method = getattr(cls, n)
      setattr(cls, n, wrapit(cls, method))
    return cls
  return dowrap

然后像这样使用它:

代码语言:javascript
复制
@returnthisclassfrom('add mul mod')
class UserString(str):
    pass

In [11]: first = UserString('first')

In [12]: print first
first

In [13]: type(first)
Out[13]: __main__.UserString

In [14]: second = first + 'second'

In [15]: print second
firstsecond

In [16]: type(second)
Out[16]: __main__.UserString

这样做的一个缺点是str不支持radd,因此'string1' + UserString('string2')将提供一个字符串,而UserString('string1') + 'string2'将提供一个UserString。我不确定有没有办法解决这个问题。

也许没有帮助,但希望它能让你走上正确的道路。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20884949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档