В Python я могу перезагрузить методы в классах, которые работают? - PullRequest
1 голос
/ 16 февраля 2012

ОК, я создаю бота Python IRC для личного использования, и я пытаюсь создать команду, которая перезагружает вторичный синтаксический анализатор, который проверяет данные irc для команд боту (основной парсер проверяет только PING и команды выхода / перезагрузки).

Есть ли способ перезагрузить код из метода, пока класс работает как объект?

Вот ссылка на полный код на сегодняшний день (не хватает большого количества команд): ссылка на вставку

Редактировать: коды объединяют множество разных вещей из онлайн и вещей, с которыми я играл, поэтому, если у вас есть какая-либо оптимизация кода (которая объясняет странные комментарии в коде), они будут приветствоваться тоже.

Ответы [ 2 ]

0 голосов
/ 16 февраля 2012

Программа может перезаписать функцию или метод другой:

def newparser(self, s):
    print s, s

myobject.parser = newparser
myobject.parser("hello") # prints "hello hello"

Но я согласен, это не очень хорошая идея.Я совершенно уверен, что не нужно , чтобы сделать такую ​​вещь.

0 голосов
/ 16 февраля 2012

Невозможно изменить код существующего объекта в Python.Вы должны перезапустить процесс.

Люди пробуют разные схемы, чтобы это произошло, но это того не стоит.Простой импорт модуля снова не будет работать, потому что N импорт приводит к тому, что файл выполняется один раз, и все операции импорта ссылаются на один и тот же объект модуля.

Если вы попытаетесь уничтожить кэш sys.modules, чтобы импорт действительно снова загрузил файл, вы все равно не будете изменять код, на который ссылаются существующие объекты.Они все еще будут указывать на оригинальный класс и методы.Новые объекты, созданные после перезагрузки, будут иметь новый код, но очень трудно избавиться от всех объектов, созданных вами при первой загрузке модуля.

...