Я задаюсь вопросом хороший способ следовать, если я хотел бы переопределить членов предыдущего определенного класса в ipython., скажите: Я определил введение класса как ниже, и позже я хочу переопределить часть функционального определения _print_api. Любой способ сделать это, не перепечатывая его.
class intro(object):
def _print_api(self,obj):
def _print(key):
if key.startswith('_'):
return ''
value = getattr(obj,key)
if not hasattr(value,im_func):
doc = type(valuee).__name__
else:
if value.__doc__ is None:
doc = 'no docstring'
else:
doc = value.__doc__
return ' %s :%s' %(key,doc)
res = [_print(element) for element in dir(obj)]
return '\n'.join([element for element in res if element != ''])
def __get__(self,instance,klass):
if instance is not None:
return self._print(instance)
else:
return self._print_api(klass)
Когда вы дойдете до точки, где у вас столько кода, проще всего просто поместить его в файл и импортировать
этот конкретный модуль. Затем, когда вам нужно обновить, вы можете отредактировать файл и повторно запустить оператор import
, и вы получите обновленный код, хотя ранее определенные объекты не будут получать обновления.
Используйте команду% edit или ее псевдоним% ed. Предполагая, что вводный класс уже существует в пространстве имен ipython, ввод % ed intro
откроет внешний редактор исходного кода для класса. Когда вы сохраните и выйдете из редактора, код будет выполнен ipython, эффективно переопределив класс.
Обратной стороной этого является то, что любые уже существующие экземпляры будут по-прежнему привязаны к старой версии класса - если это проблема, вам нужно либо воссоздать объекты, либо повторно назначить объект. class атрибут, указывающий на новую версию класса.
Вы также можете использовать % ed
в модулях, файлах и предыдущих строках ввода, например % ed 5 10:13 16
создаст и отредактирует файл, состоящий из строк ввода ipython 5,10,11,12,13,16.
На самом деле нет "хорошего" способа сделать это. Лучшее, что вы можете сделать, это что-то вроде этого:
# class defined as normally above, but now you want to change a funciton
def new_print_api(self, obj):
# redefine the function (have to rewrite it)
...
# now set that function as the _print_api function in the intro class
intro._print_api = new_print_api
Это будет работать, даже если у вас уже определены интро-объекты (то есть, когда вы вызываете introObject._print_api для уже созданного объекта, он вызовет новую функцию, которую вы установили) . К сожалению, вам все равно придется переопределять функцию, но, по крайней мере, вам не нужно переписывать весь класс.
В зависимости от вашего варианта использования лучше всего разместить его в отдельном модуле. импортируйте
класс и, когда вам нужно что-то изменить, просто используйте функцию reload ()
. Однако это не повлияет на предыдущие экземпляры класса (это может быть, а может и не быть тем, что вы хотите).
Если вы используете функции редактирования IPython %, вы можете использовать что-то вроде this