扩展Python的内置Str [英] Extending Python's builtin Str
问题描述
我正在尝试继承 str
,但由于其不变性而遇到一些困难。
class DerivedClass(str):
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(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 (结果)
返回结果
返回call_me_later
你可以通过覆盖 __ getattribute __
来做到这一点,正如Zr40建议的那样,但你需要让getattribute返回一个可调用的函数。下面的示例应该给你你想要的东西;它使用 functools.partial
包装器使生活更轻松,但如果你愿意的话,你可以不加局部地实现它:
<$来自functools的p $ p>
部分
类DerivedClass(str):
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屋!