Tôi đang cố gắng phân lớp str
, nhưng gặp một số khó khăn do tính bất biến của nó.Mở rộng nội dung của 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'>
Đối với phương pháp di truyền mà không yêu cầu bất kỳ chức năng mới, chẳng hạn như derived.lower()
, là có một cách đơn giản, pythonic để trả lại một đối tượng kiểu DerivedClass
(thay vì str
)? Hoặc tôi bị mắc kẹt bằng tay ghi đè mỗi str.method(), như tôi đã làm với 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
** Xem thêm: ** http://stackoverflow.com/questions/tagged/python+monkeypatching – dreftymac
** Xem thêm: ** http://stackoverflow.com/questions/tagged/python+method-missing – dreftymac