Вероятно, потому что C "TM структуры" делает то же.
Если вы создаете класс-оболочку, это будет работать с любым другим классом, встроенным или нет. Это называется «сдерживание и делегирование» и является распространенной альтернативой наследованию:
class SuperDuperWrapper(object):
def __init__(self, origobj):
self.myobj = origobj
def __str__(self):
return "SUPER DUPER " + str(self.myobj)
def __getattr__(self,attr):
return getattr(self.myobj, attr)
Метод __ getattr __
делегирует все запросы неопределенных атрибутов в вашем объекте SuperDuperWrapper содержащемуся объекту myobj. Фактически, учитывая динамическую типизацию Python, вы можете использовать этот класс для SuperDuper'ly обертывания чего угодно:
s = "hey ho!"
sds = SuperDuperWrapper(s)
print sds
i = 100
sdi = SuperDuperWrapper(i)
print sdi
Prints:
SUPER DUPER hey ho!
SUPER DUPER 100
В вашем случае вы должны взять возвращенный объект из функции, которую вы не можете изменить, и обернуть его в вашем собственном SuperDuperWrapper, но вы все равно можете получить к нему доступ, как если бы он был базовым объектом.
print sds.split()
['hey', 'ho!']
>>> class C(object):
... pass
...
>>> def spam(self):
... return 'spam'
...
>>> C.__str__ = spam
>>> print C()
spam
Он не будет работать с классами, которые используют __slots __
.
Создайте подкласс. Пример:
>>> import datetime
>>> t = datetime.datetime.now()
>>> datetime.datetime.__str__ = lambda self: 'spam'
...
TypeError: cant set attributes of built-in/extension type 'datetime.datetime'
>>> t.__str__ = lambda self: 'spam'
...
AttributeError: 'datetime.datetime' object attribute '__str__' is read-only
>>> class mydate(datetime.datetime):
def __str__(self):
return 'spam'
>>> myt = mydate.now()
>>> print t
2009-09-05 13:11:34.600000
>>> print myt
spam
Это мой ответ на другой вопрос :
import types
class someclass(object):
val = "Value"
def some_method(self):
print self.val
def some_method_upper(self):
print self.val.upper()
obj = someclass()
obj.some_method()
obj.some_method = types.MethodType(some_method_upper, obj)
obj.some_method()
Обратите внимание, что, используя идею подкласса Алекса, вы можете немного помочь себе, используя " from
... import
... " as
":
from datetime import datetime as datetime_original
class datetime(datetime_original):
def __str__(self):
return 'spam'
, поэтому теперь у класса стандартное имя, но другое поведение.
>>> print datetime.now()
'spam'
Конечно, это может быть опасно ...