Estoy tratando de subclase str
, pero teniendo algunas dificultades debido a su inmutabilidad.Extendiendo el String incorporado de Python
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'>
Para métodos heredados que no requieren ninguna funcionalidad nueva, como derived.lower()
, hay una manera simple, Pythonic para devolver un objeto de tipo DerivedClass
(en lugar de str
)? ¿O estoy atascado manualmente anulando cada str.method(), como hice con derived.upper()
?
Editar:
#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
** Ver también: ** http://stackoverflow.com/questions/tagged/python+monkeypatching – dreftymac
** Vea también: ** http://stackoverflow.com/questions/tagged/python+method-missing – dreftymac