Próbuję podklasę str
, ale mam pewne trudności ze względu na jego niezmienność.Rozszerzanie wbudowanego w Pythona 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'>
Dla odziedziczonych metod, które nie wymagają żadnych nowych funkcji, takich jak derived.lower()
, to istnieje prosty, pythonic sposobem powrotu obiekt typu DerivedClass
(zamiast str
)? Czy utknąłem ręcznie przesłonięcie każdego str.method(), tak jak ja z 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
** Zobacz też: ** http://stackoverflow.com/questions/tagged/python+monkeypatching – dreftymac
** Zobacz też: ** http://stackoverflow.com/questions/tagged/python+method-missing – dreftymac