от
Я читал, что это возможно, чтобы добавить метод к существующему объекту (т. е. не в определении класса) в Python. Я понимаю, что это не всегда хорошо, чтобы сделать так. Но как это сделать?

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.

17 Ответы

0 голосов
от
Я читал, что это возможно, чтобы добавить метод к существующему объекту (т. е. не в определении класса) в Python. Я понимаю, что это не всегда хорошо, чтобы сделать так. Но как это сделать?
0 голосов
от
В Python, есть разница между функциями и связанных методов.
0 голосов
от
Новый модуль является устаревшим, начиная с версии Python 2.6 и удален в 3.0, использовать типы см http://docs.python.org/library/new.html В приведенном ниже примере я намеренно удалены возвращаемое значение из функции
patch_me()
. Я думал, что возвращаемое значение может сделать один считаю, что патч возвращает новый объект, что не соответствует действительности - она изменяет входящий. Вероятно, это может способствовать более дисциплинированному использованию monkeypatching.
import types

class A(object):#but seems to work for old style objects too
    pass

def patch_me(target):
    def method(target,x):
        print "x=",x
        print "called from", target
    target.method = types.MethodType(method,target)
    #add more if needed

a = A()
print a
#out:
0 голосов
от
Предисловие - примечание о совместимости: другие ответы могут работать только в Python 2 - этот ответ должен прекрасно работает в Python 2 и 3. Если писать на Python 3 только, вы могли бы оставить прямо наследуя от
object
, но в противном случае код должен оставаться прежним. Добавление метода к существующему экземпляру объекта Я читал, что это возможно, чтобы добавить метод к существующему объекту (например, не в определении класса) в Python. Я понимаю, что это не всегда хорошее решение. Но, как это сделать? Да, это возможно, но не рекомендуется Я не рекомендую это. Это плохая идея. Не делай этого. Вот несколько причин: Вы добавляете объект, привязанный к каждому экземпляру вы это делаете. Если вы делаете это много, вы, вероятно, тратить много памяти. Связанные методы обычно создаются только на короткий срок их называют, и тогда они перестают существовать, когда автоматически сборщиком мусора. Если вы делаете это вручную, вы будете иметь имя привязки привязки привязки метода, который будет препятствовать его вывозу мусора по использованию. Экземпляры объектов данного типа, как правило, имеют свои методы для всех объектов этого типа. Если вы добавляете методы в другом месте, некоторые экземпляры будут иметь те методы, и другие не будут. Программисты не будут ожидать этого, и вы рискуете нарушая правило наименьшего удивления. Поскольку есть и другие очень веские причины не делать этого, вы дополнительно подарите себе плохую репутацию, если вы делаете это. Таким образом, я полагаю, что вы не делайте этого, если у вас есть действительно веские причины. Это гораздо лучше, чтобы определить правильный метод в определении класса или меньше, предпочтительно, чтобы обезьяна-патч класс, как это:
Foo.sample_method = sample_method
Так как это поучительно, однако, я собираюсь показать вам несколько способов сделать это. Как это можно сделать Вот код установки. Нужен определения класса. Он может быть импортирован, но это действительно не имеет значения.
class Foo(object):
    '''An empty class to demonstrate adding a method to an instance'''
Создайте экземпляр:
foo = Foo()
Создать метод, чтобы добавить к нему:
def sample_method(self, bar, baz):
    print(bar   baz)
Метод нулевой (0) - использовать метод дескриптора,
__get__
Пунктирной поиска на функции вызвать метод
__get__
функции, например, привязка объекта к методу и тем самым создавая "связанный метод".
foo.sample_method = sample_method.__get__(foo)
а теперь:
0 голосов
от
Я думаю, что ответов не пропустил ключевой момент. Допустим, есть класс с методом:
class A(object):
    def m(self):
        pass
Теперь давайте играть с ним в IPython:
In [2]: A.m
Out[2]:
0 голосов
от
В Python ямочный обезьяны, как правило, работает путем перезаписи класса или подпись функции с вашими собственными. Ниже приведен пример из Зопе Вики:
from SomeOtherProduct.SomeModule import SomeClass
def speak(self):
   return "ook ook eee eee eee!"
SomeClass.speak = speak
Этот код будет перезаписать/создать метод, называемый говорить о классе. В недавнем посте Джеффа Этвуда на латание обезьяна. Он показывает пример в C# 3.0, которая сейчас язык я использую для работы.
0 голосов
от
Вы можете использовать лямбда-привязать к экземпляру метод:
def run(self):
    print self._instanceString

class A(object):
    def __init__(self):
        self._instanceString = "This is instance string"

a = A()
a.run = lambda: run(a)
a.run()
Выход:
This is instance string
0 голосов
от
Существует как минимум два способа прикрепить метод экземпляра без
types.MethodType
:
0 голосов
от
То, что вы ищете-это
setattr
я считаю. Используйте это, чтобы установить значение атрибута объекта.
0 голосов
от
Поскольку этот вопрос для не-версий Python, вот код JavaScript:
a.methodname = function () { console.log("Yay, a new method!") }
Добро пожаловать на сайт ByNets, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...