Динамично присоединение метода к существующему объекту Python сгенерировано с большим глотком?

Вероятно, потому что C "TM структуры" делает то же.

9
задан dzhelil 5 September 2009 в 15:55
поделиться

5 ответов

Если вы создаете класс-оболочку, это будет работать с любым другим классом, встроенным или нет. Это называется «сдерживание и делегирование» и является распространенной альтернативой наследованию:

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!']
21
ответ дан 4 December 2019 в 07:23
поделиться
>>> class C(object):
...     pass
... 
>>> def spam(self):
...     return 'spam'
... 
>>> C.__str__ = spam
>>> print C()
spam

Он не будет работать с классами, которые используют __slots __ .

3
ответ дан 4 December 2019 в 07:23
поделиться

Создайте подкласс. Пример:

>>> 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
3
ответ дан 4 December 2019 в 07:23
поделиться

Это мой ответ на другой вопрос :

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()
2
ответ дан 4 December 2019 в 07:23
поделиться

Обратите внимание, что, используя идею подкласса Алекса, вы можете немного помочь себе, используя " from ... import ... " as ":

from datetime import datetime as datetime_original

class datetime(datetime_original):
   def __str__(self):
      return 'spam'

, поэтому теперь у класса стандартное имя, но другое поведение.

>>> print datetime.now()
    'spam'

Конечно, это может быть опасно ...

1
ответ дан 4 December 2019 в 07:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: