我正在尝试对字符串对象进行子类化,并向其添加几个方法。我的主要目的是学习如何做到这一点。我被困住的地方是,我是应该在元类中创建string的子类,然后使用元创建我的类,还是直接创建string的子类?
而且,我想我需要以某种方式实现__new__()
,因为我的自定义方法将修改我的string对象,并将返回新的mystr obj。
我的类的方法应该完全可以与str方法链接,并且当自定义方法修改它时,应该总是返回一个新的My类实例。我希望能够做这样的事情:
a = mystr("something")
b = a.lower().mycustommethod().myothercustommethod().capitalize()
issubclass(b,mystr) # True
我想拥有str
所拥有的所有能力。例如,a = mystr("something")
然后我想像这样使用它,a.capitalize().mycustommethod().lower()
我的理解是,我需要实现__new__()
。我认为是这样的,因为字符串方法可能会尝试创建新的str实例。因此,如果我重写__new__()
,它们应该会返回我自定义字符串类。但是,在这种情况下,我不知道如何将参数传递给我的自定义类的__init__()
方法。我想我需要使用type()
才能在__new__()
方法中创建一个新实例,对吧?
发布于 2011-08-31 18:39:53
如果要在构造时修改字符串,则可以覆盖__new__()
:
class caps(str):
def __new__(cls, content):
return str.__new__(cls, content.upper())
但是如果你只是想添加新的方法,你甚至不需要接触构造函数:
class text(str):
def duplicate(self):
return text(self + self)
注意,继承的方法,比如upper()
,仍然会返回一个普通的str
,而不是text
。
发布于 2018-06-17 05:03:47
我被其他答案的复杂性吓坏了,Python的标准库也是如此。您可以使用collections.UserString对string进行子类化,并且不会干扰代理str
的方法。
只需将其子类化,然后添加您的方法。self.data
包含由您的对象表示的实际字符串,因此您甚至可以通过在内部重新分配self.data
来实现字符串“突变”方法。
发布于 2011-08-31 18:58:43
这里有一个快速的技巧来做你想做的:你基本上拦截每个函数调用,如果你看到它返回一个字符串,你把它转换回你自己的类类型。
虽然这在这个简单的示例中有效,但它有一些限制。其中,诸如下标运算符之类的运算符显然不被处理。
class FunWrapper(object):
def __init__(self, attr):
self.attr = attr
def __call__(self, *params, **args):
ret = self.attr(*params, **args)
if type(ret) is str:
return Foo(ret)
return ret
class Foo(object):
def __init__(self, string):
self.string = string
def __getattr__(self, attr):
return FunWrapper(getattr(self.string, attr))
def newMethod(self):
return "*%s*" % self.string.upper()
f = Foo('hello')
print f.upper().newMethod().lower()
https://stackoverflow.com/questions/7255655
复制相似问题