18

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)
4

5 に答える 5

12

%edit コマンドまたはそのエイリアス %ed を使用します。intro クラスが ipython 名前空間に既に存在すると仮定すると、入力%ed introするとクラスのソース コードで外部エディターが開きます。エディターを保存して終了すると、コードが ipython によって実行され、効果的にクラスが再定義されます。

これの欠点は、既に存在するインスタンスが依然として古いバージョンのクラスにバインドされることです。これが問題になる場合は、オブジェクトを再作成するか、obj を再割り当てする必要があります。クラスの新しいバージョンを指すclass属性。

%edモジュール、ファイル、および以前の入力行で使用することもできます。たとえば%ed 5 10:13 16、ipython 入力行 5、10、11、12、13、16 で構成されるファイルを作成および編集します。

于 2010-04-06T16:40:16.657 に答える
6

IPython %edit 機能を使用する場合、次のようなものを使用できます

于 2010-04-06T16:39:48.060 に答える
0

それを行うための「良い」方法は本当にありません。あなたができる最善のことは、次のようなものです:

# 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

これは、既に intro オブジェクトが定義されている場合でも機能します (つまり、既に作成されたオブジェクトで introObject._print_api を呼び出すと、設定した新しい関数が呼び出されます)。残念ながら、関数を再定義する必要はありますが、少なくともクラス全体を書き直す必要はありません。

ユースケースによっては、別のモジュールに入れるのが最善の方法かもしれません。importクラスを変更し、何かを変更する必要がある場合は、reload()関数を使用してください。ただし、これはクラスの以前のインスタンスには影響しません (これが必要な場合とそうでない場合があります)。

于 2010-04-06T16:16:16.540 に答える
0

それほど多くのコードが得られたら、それをファイルとimportその特定のモジュールに配置するのが最も簡単です。その後、更新が必要な場合は、ファイルを編集してimportステートメントを再実行すると、更新されたコードが取得されますが、以前に定義されたオブジェクトは更新されません。

于 2010-04-06T16:19:24.723 に答える