我知道如何使用:
覆盖字符串类class UserString:
def __str__(self):
return 'Overridden String'
if __name__ == '__main__':
print UserString()
但是如何在不定义隐式str
类的情况下使用此类而不是内置UserString
类?要清楚
我想要这个:
>>> print "Boo boo!"
Overridden String
答案 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。不确定是否有办法解决这个问题。
也许没有帮助,但希望它能让你走上正轨。