Существует ли способ засолить определение класса?
То, что я хотел бы сделать, засолить определение (который может созданный динамично), и затем отправьте его по соединению TCP так, чтобы экземпляр мог быть создан на другом конце.
Я понимаю, что могут быть зависимости, как модули и глобальные переменные, на которые полагается класс. Я хотел бы связать их в процессе соления также, но я не обеспокоен автоматическим обнаружением зависимостей, потому что это хорошо, если бремя находится на пользователе для определения их.
Увы, не напрямую. Вы можете отправить строковую форму оператора класса
или форму байт-кода и «повторно гидратировать» ее с помощью exec
на принимающей стороне.
В документации довольно хорошо объясняется, что можно и что нельзя мариновать, и почему.
http://docs.python.org/library/pickle.html#what-can-be-pickled-and-unpickled
В основном, если класс или модуль можно импортировать по имени, когда он будет распакован, то он должен работать, если только вы не планируете изменить определение класса между тем, как вы его распакуете. В приведенном ниже определении класса только имя класса "Test" и имя метода "mymethod" будут распакованы. Если вы выделите определение класса, а затем измените его так, что attr станет другим значением, а mymethod будет делать что-то совершенно другое, выделитель выделит новое определение.
class Test(object):
attr = 5
def mymethod(self, arg):
return arg