扩展Python的内置Str [英] Extending Python's builtin Str

查看:114
本文介绍了扩展Python的内置Str的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试继承 str ,但由于其不变性而遇到一些困难。

  class DerivedClass(s​​tr):

def __new __(cls,string):
ob = super(DerivedClass,cls).__ new __(cls,string)
返回ob

def upper(self):
#overridden,新功能。返回DerivedClass类型的ob。大。
caps = super(DerivedClass,self).upper()
return DerivedClass(caps +'123')

derived = DerivedClass('a')

print derived.upper()#'A123'
print type(derived.upper())#< class'__main __。DerivedClass'>
print derived.lower()#'a'
打印类型(derived.lower())#< type'str'>

对于不需要任何新功能的继承方法,例如派生.lower(),是否有一种简单的pythonic方法来返回 DerivedClass 类型的对象(而不是 str )?或者我是否手动覆盖每个str.method(),就像我使用 derived.upper()



编辑:

 #以下的任何重大缺陷? 

class DerivedClass(s​​tr):
def __new __(cls,string):
ob = super(DerivedClass,cls).__ new __(cls,string)
return ob

def upper(self):
caps = super(DerivedClass,self).upper()
return DerivedClass(caps +'123')

def __getattribute __(self,name):
att = super(DerivedClass,self).__ getattribute __(name)

if not callable(att):
return att

def call_me_later(* args,** kwargs):
result = att(* args,** kwargs)
if isinstance(result,basestring):
return DerivedClass (结果)
返回结果
返回call_me_later


解决方案

你可以通过覆盖 __ getattribute __ 来做到这一点,正如Zr40建议的那样,但你需要让getattribute返回一个可调用的函数。下面的示例应该给你你想要的东西;它使用 functools.partial 包装器使生活更轻松,但如果你愿意的话,你可以不加局部地实现它:



<$来自functools的p $ p> 部分

类DerivedClass(s​​tr):

def __new __(cls,string):
ob = super(DerivedClass,cls).__ new __(cls,string)
return ob

def upper(self):
#overridden,new function。返回DerivedClass类型的ob。大。
caps = super(DerivedClass,self).upper()
return DerivedClass(caps +'123')

def __getattribute __(self,name):
func = str .__ getattribute __(self,name)
if name =='upper':
return func

if not callable(func):
return func

def call_me_later(* args,** kwargs):
result = func(* args,** kwargs)
#一些str函数返回列表,整数等等
if isinstance(result,basestring:
return DerivedClass(result)
return result

return partial(call_me_later)


I'm trying to subclass str, but having some difficulties due to its immutability.

class DerivedClass(str):

    def __new__(cls, string):
        ob = super(DerivedClass, cls).__new__(cls, string)
        return ob

    def upper(self):
        #overridden, new functionality. Return ob of type DerivedClass. Great.
        caps = super(DerivedClass, self).upper()
        return DerivedClass(caps + '123')

derived = DerivedClass('a')

print derived.upper() #'A123'
print type(derived.upper()) #<class '__main__.DerivedClass'>
print derived.lower() #'a' 
print type(derived.lower()) #<type 'str'>  

For inherited methods that don't require any new functionality, such as derived.lower(), is there a simple, pythonic way to return an object of type DerivedClass (instead of str)? Or am I stuck manually overriding each str.method(), as I did with derived.upper()?

Edit:

#Any massive flaws in the following?

class DerivedClass(str):
    def __new__(cls, string):
        ob = super(DerivedClass, cls).__new__(cls, string)
        return ob

    def upper(self):
        caps = super(DerivedClass, self).upper()
        return DerivedClass(caps + '123')

    def __getattribute__(self, name):
        att = super(DerivedClass, self).__getattribute__(name)

        if not callable(att):
            return att

        def call_me_later(*args, **kwargs):
            result = att(*args, **kwargs)
            if isinstance(result, basestring):
                return DerivedClass(result)
            return result
        return call_me_later

解决方案

You can do this by overriding __getattribute__ as Zr40 suggests, but you will need to have getattribute return a callable function. The sample below should give you what you want; it uses the functools.partial wrapper to make life easier, though you could implement it without partial if you like:

from functools import partial

class DerivedClass(str):

    def __new__(cls, string):
        ob = super(DerivedClass, cls).__new__(cls, string)
        return ob

    def upper(self):
        #overridden, new functionality. Return ob of type DerivedClass. Great.
        caps = super(DerivedClass, self).upper()
        return DerivedClass(caps + '123')

    def __getattribute__(self, name):
        func = str.__getattribute__(self, name)
        if name == 'upper':
            return func

        if not callable(func):
            return func

        def call_me_later(*args, **kwargs):
            result = func(*args, **kwargs)
            # Some str functions return lists, ints, etc
            if isinstance(result, basestring:
                return DerivedClass(result)
            return result

        return partial(call_me_later)

这篇关于扩展Python的内置Str的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆