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

时间:2014-01-02 14:18:45

标签: python

我知道如何使用:

覆盖字符串类
class UserString:
    def __str__(self):
        return 'Overridden String'

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

但是如何在不定义隐式str类的情况下使用此类而不是内置UserString类?要清楚 我想要这个:

>>> print "Boo boo!"
Overridden String

2 个答案:

答案 0 :(得分:2)

这是不可能的。你还没有重写字符串类。

您无法覆盖类。您可以覆盖方法。你所做的是定义一个类,只覆盖它的 str ()方法。

但你可以这样做......

def overriden_print(x):
    print "Overriden in the past!"

from __future__ import print_function  # import after the definition of overriden_print

print = overriden_print

print("Hello")

输出:

  

过去的Overriden!

答案 1 :(得分:1)

在不破解python可执行文件本身的情况下做你想做的事是不可能的......毕竟,str是一个内置类型,并且当传递'string'类型时,解释器将始终是创建内置字符串。

但是...... 可以使用委托来做这样的事情。这是从另一个stackoverflow配方略微修改(遗憾的是,我没有在我的代码中包含链接...),所以如果这是你的代码,请随意声明:)

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

然后你就这样使用它:

@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。不确定是否有办法解决这个问题。

也许没有帮助,但希望它能让你走上正轨。