「Python 上級シリーズ」第 1 回: Python パッケージを使用してコードを整理する

        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

おすすめ

転載: blog.csdn.net/liuqinhou/article/details/129901205