2017-06-20 17 views
-1

モジュールの属性が、属性と同じ名前の同じモジュールに定義されている関数にバインドされている場合、そのモジュールの外部から関数を直接呼び出すにはどうすればよいですか?同じモジュール内の属性と同じ名前のモジュールで定義された関数をどのように呼び出すことができますか?

たとえば、builtins.__import__属性は、デフォルトでbuiltins.__import__関数にバインドされます。

私はbuiltins.__import__異なる機能へbuiltins.__import__属性を再バインドした場合、私はbuiltins.__import__属性によって、新しい機能を呼び出すものとどのように

  • builtins.__import__属性を関数であるかのように扱い、builtins.__import__(argument)のように呼び出します。

  • builtins.__import__属性によって非表示になっている場合、builtins.__import__関数を呼び出すにはどうすればよいですか?

ありがとう。

+0

1.確かに、別の関数をその名前にバインドするのはなぜですか?あなたはそれにアクセスしたい場合はおそらくできません*置き換えないでください*。 – jonrsharpe

答えて

3

まず、技術的に言えば、関数には名前がありません。「関数a」というようなものはありません。関数(メモリ内)を指すプロパティ/属性/引数aしかありません。したがって、あなたが元の関数のメモリ内の位置を知っていなければ、それは(非常に単純化された)どのプロパティ/変数が(ラップされた)ポインタを表しているのですか?それはあなたのために失われます。どこを見るかわからない場合は何かを見つけることができます(手動でメモリを少しずつ移動し、探している構造を識別することを除いて)。あなたが知っていれば、それを検索するのではなく関数を再作成することができます)。

実際、Pythonはリファレンスカウントを失うオブジェクトのメモリを解放するのに十分スマートです。そうしないと、多くのPythonが動作を停止します(または動作の最初の秒以内にメモリシンクホールを作成します)。builtin.__import__ (私の知る限り、CPythonでは標準ではありません)、他の関数を指すように上書きすると、(現在のプロセスの持続時間のために)永遠に消えてしまいます。

問題の関数の重要性を考えれば、レベル2またはそれ以上の参照が残っているので、おそらくガベージコレクションは行われませんが、関数とは異なる 'ルート' SO答えの範囲から時間のかかる作業方法になります。

この事実を使用して「サンドボックス化されたPython」を構築することを望んでいれば - そうしないでください。いくつかの人々が回避策を見つけるために献身する時間を過小評価してはいけないので、多くは以前に試して失敗しました。使い捨てのVMでPythonのインスタンスを実行し、気晴らしの人生を送るだけです(本当に誰かが実際にそれを打破する方法を見つけるまで)。

関連する問題