Pythonパッケージ(パッケージ)を使ってコード整理
最近、Python入門スキルツリーを見ていたら、Pythonパッケージ整理コードを見てとても面白いと思ったので、まとめてメモに書いてみました。
Python は、特別な種類のモジュールであるパッケージを通じてコードを編成します。
Python パッケージには、通常のパッケージと名前空間パッケージ の 2 つの形式があります。
通常のパッケージとは、__init__.py を含むディレクトリを指し、そのようなパッケージが他のモジュールによってインポートされると、ディレクトリの下の __init__.py 内のコードが最初に実行されます。通常のパッケージは入れ子にすることができます。つまり、ディレクトリの下のサブディレクトリもパッケージにすることができます。
1. 事前準備
parent/__init__.py のコードが次のようになっているとします。
print('从前有座山,')
parent/one/__init__.py のコードが次のようになっているとします。
print('山上有座庙,')
parent/one/one/__init__.py のコードが次のようになっているとします。
print('庙里有个老和尚,')
parent/two/__init__.py のコードが次のようになっているとします。
print('老和尚说:')
parent/three/__init__.py のコードが次のようになっているとします。
print('从前有座山,')
上記のように、対応する py ファイルを作成します。対応する効果を下の図に示します。
特定のファイルの内容は、次のものに対応します。
# |-parent:
# |---print('从前有座山,')
# |---one:
# |-------print('山上有座庙,')
# |-------one:
# |-----------print('庙里有个老和尚,')
# |---two:
# |-------print('老和尚说:')
# |---three:
# |-------print('从前有座山,')
2、さまざまなインポート呼び出し方法
モジュールがインポートされている場合、Python はインポートされたモジュールをsys.modulesディクショナリにキャッシュし、再度インポートされたときにインポート アクションを再実行せず、キャッシュから直接取得します。逆に、インポートしたモジュールを sys.modules から削除すると、インポートによってモジュールのインポート アクションが再度トリガーされます。
最初にdel を紹介します。Pythonの del は、対応する変数の参照を削除するために使用されます。Python はすべて参照であり、Python には GC メカニズムがあるため、del ステートメントはデータ オブジェクトではなく変数に作用します。
if __name__ == '__main__':
a = 1 # 对象 1 被 变量a引用,对象1的引用计数器为1
b = a # 对象1 被变量b引用,对象1的引用计数器加1
c = a # 1对象1 被变量c引用,对象1的引用计数器加1
del a # 删除变量a,解除a对1的引用
del b # 删除变量b,解除b对1的引用
print(c) # 最终变量c仍然引用1
つまり、del はデータではなく変数を削除します。
実験
if __name__ == '__main__':
while True:
import parent.one.one
# 从前有座山,
# 山上有座庙,
# 庙里有个老和尚,
import parent.one.one 操作は、3 つの __init__.py の内容を同時に出力します。
if __name__ == '__main__':
while True:
import parent.one.one
import parent.two
# 从前有座山,
# 山上有座庙,
# 庙里有个老和尚,
# 老和尚说:
これは、Python がインポートされたモジュールを sys.modules ディクショナリにキャッシュし、再度インポートするときにインポート アクションを再実行せず、キャッシュから直接取得するためです。そのため、プリントアウトは 1 つだけです。
if __name__ == '__main__':
while True:
import parent.one.one
del sys.modules['parent.one.one']
# 从前有座山,
# 山上有座庙,
# 庙里有个老和尚,
# 庙里有个老和尚,
# 庙里有个老和尚,
# ...
これは、'parent.one.one' のインポートされたモジュールを sys.modules から削除した後、再度インポートするとモジュールのインポート アクションが再度トリガーされるためです。
したがって、対応するコンテンツをループで出力するには、インポートしたモジュールをループごとに 1 つずつ削除して、ループを開始できるようにする必要があります。
タスク:上記の知識を使用して、私たちの目標は、インポート ステートメントを使用してモジュールをインポートし、各パッケージ ディレクトリの __init__.py が読み込まれたときに print ステートメントの実行をトリガーして、ループで出力することです。
从前有座山,
山上有座庙,
庙里有个老和尚,
老和尚说:
从前有座山,
山上有座庙,
庙里有个老和尚,
老和尚说:
从前有座山,
...
上記を知って実験すれば、あとは簡単!最初の書き方
import sys
if __name__ == '__main__':
while True:
import parent.one.one
import parent.two
import parent
del sys.modules['parent.one']
del sys.modules['parent.one.one']
del sys.modules['parent.two']
del sys.modules['parent']
第二の書き方
import sys
if __name__ == '__main__':
while True:
import parent.one.one
import parent.two
del sys.modules['parent']
del sys.modules['parent.one']
del sys.modules['parent.one.one']
del sys.modules['parent.two']
第三の書き方
import sys
if __name__ == '__main__':
while True:
import parent
import parent.one
import parent.one.one
import parent.two
del sys.modules['parent']
del sys.modules['parent.one']
del sys.modules['parent.one.one']
del sys.modules['parent.two']
参考
https://edu.csdn.net/skill/practice/python-3-6/164?typeId=17350&language=python
https://www.it610.com/article/1521467954061967360.htm