首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python中创建字符串子类

如何在Python中创建字符串子类
EN

Stack Overflow用户
提问于 2011-08-31 18:28:29
回答 4查看 23.7K关注 0票数 40

我正在尝试对字符串对象进行子类化,并向其添加几个方法。我的主要目的是学习如何做到这一点。我被困住的地方是,我是应该在元类中创建string的子类,然后使用元创建我的类,还是直接创建string的子类?

而且,我想我需要以某种方式实现__new__(),因为我的自定义方法将修改我的string对象,并将返回新的mystr obj。

我的类的方法应该完全可以与str方法链接,并且当自定义方法修改它时,应该总是返回一个新的My类实例。我希望能够做这样的事情:

代码语言:javascript
复制
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__()方法中创建一个新实例,对吧?

EN

回答 4

Stack Overflow用户

发布于 2011-08-31 18:39:53

如果要在构造时修改字符串,则可以覆盖__new__()

代码语言:javascript
复制
class caps(str):
   def __new__(cls, content):
      return str.__new__(cls, content.upper())

但是如果你只是想添加新的方法,你甚至不需要接触构造函数:

代码语言:javascript
复制
class text(str):
   def duplicate(self):
      return text(self + self)

注意,继承的方法,比如upper(),仍然会返回一个普通的str,而不是text

票数 45
EN

Stack Overflow用户

发布于 2018-06-17 05:03:47

我被其他答案的复杂性吓坏了,Python的标准库也是如此。您可以使用collections.UserString对string进行子类化,并且不会干扰代理str的方法。

只需将其子类化,然后添加您的方法。self.data包含由您的对象表示的实际字符串,因此您甚至可以通过在内部重新分配self.data来实现字符串“突变”方法。

An example

票数 29
EN

Stack Overflow用户

发布于 2011-08-31 18:58:43

这里有一个快速的技巧来做你想做的:你基本上拦截每个函数调用,如果你看到它返回一个字符串,你把它转换回你自己的类类型。

虽然这在这个简单的示例中有效,但它有一些限制。其中,诸如下标运算符之类的运算符显然不被处理。

代码语言:javascript
复制
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()
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7255655

复制
相关文章

相似问题

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