Sto provando a sottoclasse str
, ma avendo qualche difficoltà a causa della sua immutabilità.Estendere il built-in di Python Str
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'>
Per i metodi ereditati che non richiedono alcuna nuova funzionalità, come derived.lower()
, c'è un modo semplice divinatorio per restituire un oggetto di tipo DerivedClass
(anziché str
)? O sono bloccato manualmente ignorando ogni str.method(), come ho fatto con 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
** Vedi anche: ** http://stackoverflow.com/questions/tagged/python+monkeypatching – dreftymac
** Vedi anche: ** http://stackoverflow.com/questions/tagged/python+method-missing – dreftymac