Ich versuche, str
Unterklasse, aber einige Schwierigkeiten aufgrund seiner Unveränderlichkeit.Erweitern Python eingebaute 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'>
für geerbte Methoden, die, wie derived.lower()
keine neue Funktionalität erfordern, gibt es eine einfache, pythonic Weise ein Objekt vom Typ zurückzukehren DerivedClass
(statt str
)? Oder stehe ich fest, manuell jede str.method() überschreiben, wie ich es mit derived.upper()
getan habe?
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
** Siehe auch: ** http://stackoverflow.com/questions/tagged/python+monkeypatching – dreftymac
** Siehe auch: ** http://stackoverflow.com/questions/tagged/python+method-missing – dreftymac