pythonの基礎を学びます:モジュールとパッケージ


一、モジュールとは何か
私たちの普段の開発過程では、Pythonの内蔵機能、あるいは第三者のライブラリ、私たちが使っているPythonの内蔵機能、サードパーティのライブラリなど、いくつかのモジュールと言えます.
たとえば、ファイルを読み書きするときに、ファイル操作のモジュールosを使用します.
よく出会うのではないでしょうか.モジュール、来た!
実際には、Pythonスクリプトファイルごとにモジュールと見なすことができます.
モジュールはディスクファイルとして存在します.1つのモジュールが大きすぎて、多すぎる機能を駆動している場合は、いくつかのコードを分解して別のモジュールを構築することを考慮する必要があります.
モジュール内のコードは、直接実行されるスクリプトであってもよいし、ライブラリ関数のようなコードであってもよく、他のモジュールによってインポート(import)されて呼び出されてもよい.モジュールは、直接実行されるコードブロック、クラス定義、関数定義、またはこれらの組合せを含むことができる.
すべてのモジュールをPythonモジュールの先頭部分にインポートすることをお勧めします.そして、このような順序で行うことが望ましい.
  • Python標準ライブラリモジュール
  • Pythonサードパーティモジュール
  • カスタムモジュール
  • これはただ約束がこんなにいいと言っているだけで、実はどんな順番でも大丈夫です!!!
    二、モジュールの使い方
    モジュールとは何か知っているだろうと思います.
    では、使い方を見てみましょう.
    Pythonでは、あるモジュールをキーワードimportで導入し、例えばモジュールosを導入するには、ファイルの最初の場所でimport osで導入することができる.以下、簡単な例を見てみましょう.
    #     os  
    import os
    
    #         
    files = os.listdir('F:\\    \\2018       (  )\\ 、python  (1)\\  PPT\\  PPT')
    print(files)

    この例では、システムosモジュールを導入し、このosモジュールのメソッドを呼び出して、ターゲットディレクトリの下のすべてのファイルをリストします.
    importの使い方
    構文
    import module1 
    import module2
    ......
    import moduleN

    または
    import module1[, module2[,... moduleN]]

    []:オプションを示します.
    モジュール関数呼び出し
    モジュールをインポートすると、 .
    でモジュール内の関数を呼び出すことができます.実際には、 でメソッドを呼び出すこともできます.しかし、複数のモジュールに同じメソッド名がある場合は、 . でモジュール内の関数を呼び出さなければなりません.そうしないと衝突します.
    たとえば
    files = os.listdir('F:\\    \\2018       (  )\\ 、python  (1)\\  PPT\\  PPT')

    これがモジュールを呼び出す方法です!
    モジュールの一部のメソッドのインポート
    モジュール内のすべてのメソッドをインポートする必要がない場合があります.したがって、pythonは、インポートする必要があるメソッドのみをインポートする方法を提供します.
  • from modname import name1[, name2[, ... nameN]]

  • たとえば、モジュールtimeのsleep関数をインポートするには、次の文を使用します.
    from time import sleep, strptime

    すべてをインポート
    from modname import*

    时には、モジュールの名前が长すぎたり、复雑すぎたりして、书く时に不便かもしれません.だから、別名を使ってインポートすることができて、书きやすいです.
    エイリアスインポート
    エイリアスインポートは、インポート文の後にキーワードasを付けるだけです.
    import numpy
    import numpy as np  #  numpy    np

    二、カスタムモジュール
    pythonに内蔵されたモジュールがある以上、自分のモジュールをカスタマイズして、自分の機能をモジュールにすることができますか?
    もちろん大丈夫です.次は自分で実現します.
    同フォルダ実装
    これはpythonファイルが同じフォルダにある場合です.
    次に、同じフォルダの下で2つのpythonファイルを定義します.それぞれtest.py,02_demo.pyです.test.pyでは、次のように定義されています.
    def sum(a, b):
        return a + b

    インポート方法
    02_demo.py中
    #        
    import test
    
    from test import sum
    
    print(sum(1, 2))

    同じフォルダの下で、直接 だけでいいことがわかります!
    異なるフォルダ実装
    現在、02_demo.pylearnのファイルの下にあるtest02.pyのファイルがあります.ディレクトリは次のとおりです.test02.py内容
    def mul(a, b):
        return a * b
    
    02_demo.pyでフォルダ間呼び出し
    #       
    import learn.test2
    
    from learn import test2
    
    print(test2.mul(1, 5))

    異なるフォルダの呼び出しでは、test 02ファイルがlearnフォルダの下にあるなど、ファイルパスを追加する必要があるため、learn.test02でインポートされます.
    しかし、これは最も完璧ではありません.プロジェクトが大きい場合、フォルダの下に多くのモジュールがあり、それぞれがこのように導入されているかどうかは、面倒ではないかと思います.したがって、pythonでは、ターゲットパスを環境に追加するより簡単な方法も提供されます.
    '''
             2
    '''
    import sys  #       
    
    print(sys.path)
    #             
    sys.path.append('.\\learn')  #        
    import test2 as tt
    
    print(tt.mul(1, 10))

    簡単になったのではないでしょうか.
    また、自分で定義したモジュールとシステムモジュールが重複している場合は、インポート時にシステムのモジュールを上書きしますよ!
    たとえば、learnフォルダの下にmath.pyファイルを定義します.
    math.pyファイル
    import math
    
    def tan(x):
        return math.tan(x) + 1

    mathをインポートすると、システムのmathが上書きされ、カスタマイズされたmathがインポートされます.
    #       
    from learn import math
    
    print('   :', math.tan(30))
    
    import math
    
    print('  :', math.tan(30))

    最後にもう一つお話しします、バッグ!
    三、バッグ
    モジュールがある以上、なぜバッグがあるのか、バッグはいったい何なのか.いっしょに来させてください.
    私たちは1つのモジュールが通常pythonファイルであることを知っていますが、これはあまりにもばらばらに見えるのではないでしょうか.もし私たちが外出するとき、物が多すぎて、これらのものを入れるためにかばんが必要なのではないでしょうか.だから、パッケージはこの役割で、いくつかの機能が近いモジュールや似ているモジュールを、パッケージと呼ばれる場所に置いています!
    このかばんはどうですか.ははは!
    では、パッケージとモジュールはいったい何が違うのでしょうか.
    パッケージの使用
    パッケージはフォルダですが、プログラムによって__init__.pyと認識され、モジュールがインポートに成功するには、このフォルダの下に のファイルを定義する必要があります.
    まず、packageというフォルダを新規作成し、__init__.pyというファイルを定義します.
    次に、このフォルダの下にtest10.pytest11.pyのファイルを新規作成します.内容は以下の通りです.
    test10.py
    def subtract(x, y):
        return x - y
    

    test11.py
    def add(x, y):
        return x + y

    では、今バッグを案内してみましょう.
    #     
    
    import package
    
    print(test10.subtract(10, 10))

    私たちは間違っていることに気づきました:私たちのtest 10は定義されていませんが、私たちは定義しているのに、なぜですか?
    もともと、__init__.pyファイルを作成し、__all__変数を必ずファイルに書き込むには、なぜこの変数が必要なのでしょうか.__init__.pyはパケットのインポート動作を制御しているからである.__init__.pyファイル であれば、このパッケージをインポートするだけで、パッケージ内のモジュールはインポートされません.__init__.py__all__変数は、fromパッケージ名importを*制御する際に導入されるモジュール**です.
    したがって、__init__.py__all__変数を加えます.
    __all__ = ['test10', 'test11']

    正しいです.
    かばんはできましたか.
    最後の最後に、小さな知識点を話します.
    imp.reload()
    この関数はどんな役割を果たしますか?
    このようなシーンを考えてみると、モジュールは初めてインポートされた後、他のインポートは有効ではありません.モジュールのソースファイルを別のウィンドウで変更して保存しても、モジュールを更新できません.
    このような設計の理由は、インポートは、ファイルを見つけてバイトコードにコンパイルし、コードを実行する必要があるオーバーヘッドの大きい操作であり、各ファイル、各プログラムの実行を複数回繰り返すことができないためである.
    モジュールがスクリプトにインポートされると、モジュールの最上位部分のコードは一度だけ実行されます.したがって、モジュールの最上位部分のコードを再実行したい場合は、reload()関数を使用します.この関数は、以前にインポートしたモジュールを再インポートします.
    '''
            
    '''
    import test
    # import test  #         hahaha
    import imp
    imp.reload(test)  #    test