Pythonトリック操作:モジュールのオーバーロードの5つの方法

環境への準備

bar.pyファイルを含む新しいフォルダfooを作成します

$ tree foo
foo
└── bar.py

0 directories, 1 file

bar.pyの内容は非常にシンプルで、printステートメントを書くだけです。

print("successful to be imported")

bar.pyが一度インポートされる限り、印刷されると実行されます

重複インポートはありません

'sys.modulesが存在するため、インポートしたモジュールをインポートすると、実際には効果がありません。'

>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>

インポート方法1を繰り返します

python2を使用する場合(前にfooフォルダーの下に追加することを忘れないでください__init__.py)、直接使用できるreloadメソッドがあります

>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> reload(bar)
successful to be imported
<module 'foo.bar' from 'foo/bar.pyc'>

python3を使用する場合は、他にも方法があります。詳細については、以下を参照してください。

インポート方法2を繰り返します

Python3.0-> 3.3を使用する場合は、imp.reloadメソッドを使用できます

>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> import imp
>>> imp.reload(bar)
successful to be imported
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>

ただし、この方法はPython3.4以降では推奨されていません

<stdin>:1: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses

インポート方法3を繰り返します

Python 3.4以降を使用している場合は、importlib.reloadメソッドを使用してください

>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> import importlib
>>> importlib.reload(bar)
successful to be imported
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>

インポート方法4を繰り返します

パッケージローダーについて何か知っている場合(詳細については、以前に書いた記事を読むことができます:https//iswbm.com/84.html)

次の方法も使用できます

>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> bar.__spec__.loader.load_module()
successful to be imported
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>

インポート方法5を繰り返します

繰り返しインポートに影響を与えるのはsys.modulesなので、インポートしたパッケージをそこから削除できますか?

>>> import foo.bar
successful to be imported
>>>
>>> import foo.bar
>>>
>>> import sys
>>> sys.modules['foo.bar']
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>
>>> del sys.modules['foo.bar']
>>>
>>> import foo.bar
successful to be imported

前の例ではすべて使用しましたfrom foo import barが、この例では使用import foo.barしました。なぜですか。

これは、from foo import barこの方法を使用する場合、sys.modulesモジュールを削除してこのメ​​ソッドをオーバーライドすることは無効であるためです。

これは小さな穴と見なす必要があります。知らない人は穴に落ちて登ることができません。

>>> import foo.bar
successful to be imported
>>>
>>> import foo.bar
>>>
>>> import sys
>>> del sys.modules['foo.bar']
>>> from foo import bar
>>>

多数(300)のイラスト含まれているオリジナルの「PyCharmChinese Guide」e-bookをお勧めします。これはよくできていて、すべてのPythonエンジニアによるコレクションに値します。

アドレスは次のとおりです:http//pycharm.iswbm.com

おすすめ

転載: blog.csdn.net/weixin_36338224/article/details/109065152