Pythonベースモジュール、package、init、all

13944 ワード


module


モジュール(module)は、関数、変数、またはクラスを含むファイルです.
モジュールは他のPythonプログラムでロードして使用できます.他の開発者が作成したモジュールを使用するか、直接拡張できます.
開発者はプログラミング時に大量のモジュールを使用します.

  • モジュールを作成して読み込みましょう.
  • まずは劇場modulepyというファイルを作成し、関数を入れました.これはモジュールになりました.
    # 파일명은 theater_module.py로 만들었습니다.
    
    #일반 가격
    def price(people):
        print("{0}명 가격은 {1}원 입니다.".format(people, people * 10000))
    
    #조조할인 가격
    def price_morning(people):
        print("{0}명 조조 할인 가격은 {1}원 입니다".format(people, people * 6000))
    
    #군인 할인 가격
    def price_soldier(people):
        print("{0}명 군인 할인 가격은 {1}원 입니다.".format(people, people * 4000))    
  • モジュールを読み込みます.
    theater_module.pyを作成すると、ロードするファイルからロードされます.
    いろんな方法で歌います
  • import theater_module
    
    test.price(3) #3명이서 영화 보러 갔을 때 가격
    test.price_morning(4) # 4명이서 조조 할인 영화 보러 갔을 때
    test.price_soldier(5) # 5명의 군인이 영화 보러 갔을 때
    
    > 3명 가격은 30000원 입니다.
    > 4명 조조 할인 가격은 24000원 입니다
    > 5명 군인 할인 가격은 20000원 입니다.
    #두번째 예제 입니다.
    
    import theater_module as tm
    
    tm.price(3)
    tm.price_morning(4)
    tm.price_soldier(5)
    
    > 3명 가격은 30000원 입니다.
    > 4명 조조 할인 가격은 24000원 입니다
    > 5명 군인 할인 가격은 20000원 입니다.
    #세번째 예제 입니다.
    from theater_module import *
    #*의 뜻은 theater_module의 모든걸 사용하겠다는 의미입니다.
    
    price_soldier(3)
    price(2)
    price_morning(5)
    
    #혹은
    
    #원하는 함수만 가져다가 사용할수 있습니다.
    from theater_module import price, price_morning
    
    price(5)
    price_morning(2)
    
    #마지막으로
    from theater_module import price_morning as price
    #요약하자면 theater_module에서 price_moring만 사용할것입니다. 그것의 별명은 price입니다. 여기서 price는 theater_module 속에있는 price함수가 아닙니다.
    price(5)
    

    package


    Pythonでは、モジュールは1つです.パッケージとは、これらのモジュールを集約する集合です.Pythonのパッケージは、1つのディレクトリに配置されたモジュールのセットを指します.
    まだちょっと(.)Pythonモジュールを階層(ディレクトリ構造)で管理できます.


    例えば、旅行会社のプロジェクトを管理します.
    まず新しいフォルダを作成します.travelという名前のフォルダにベトナムがありますpy, thailand.py, __init__ .pyという名前のフォルダを3つ作成__init__ .以下でpyを処理します.
    * 각 파일에 클래스 함수를 추가해주겠습니다.
    # thailand.py
    class ThailandPackage:
        def detail(self):
            print("[태국 패키지 3박 5일] 방콕, 파타야 여행 (야사징 투어) 50만원")
            
    #vietnam.py        
    class VietnamPackage:
        def detail(self):
            print("[배트남 패키지 3박 5일] 다낭 효도 여행 60만원")
    * 그리고 travel 패키지를 사용할 practice.py 라는 파일에서 실행해보겠습니다. 
    
    import travel.thailand
    trip_to = travel.thailand.ThailandPackage()
    trip_to.detail()
    
    > [태국 패키지 35] 방콕, 파타야 여행 (야사징 투어) 50만원
    # travel 패키시 속에 있는는 thailand모듈에 대한 ThailandPackage 클래스를 직접 사용해봤습니다.
    #주의 할점은 import travel.뒤에올 이곳에는 항상 모듈이나 패키지만 올수있습니다.import travel.ThailandPackage은 사용이 불가능합니다.
    
    하지만 from import에서는 사용이 가능합니다.
    from travel.thailand import ThailandPackage
    trip_to = ThailandPackage()
    trip_to.detail()
    
    > [태국 패키지 35] 방콕, 파타야 여행 (야사징 투어) 50만원
    

    __init__ , __all__

  • 2.xバージョンおよびそのサブバージョンでは、パッケージフォルダに__init__が含まれている必要があります.pyという名前のファイルが存在します.このファイルの役割は、ディレクトリがパッケージの一部であることを示すことです.
  • パッケージに含まれているディレクトリに__init__がある場合.pyファイルがない場合は、パッケージとして認識されません.
  • 3.x以降のバージョンは__init__です.pyがなくてもパッケージとして認識できますが、サブバージョンの互換性のために__init__に変更されました.pyファイルを作成するのは安全な方法です.
  • __init__ .pyファイルでは、リスト変数__all__は重要な変数です.「from package name import*」文を使用すると、この変数にはパッケージ内のインポート可能なモジュールのリストが含まれます.つまり、__all__に存在しないモジュールはインポートされず、エラーが発生しません.
  • *を使用して特定のディレクトリのモジュールをインポートする場合は、そのディレクトリの__init__を次のようにインポートします.変数__all__を設定およびインポートするためのモジュールをpyファイルに定義する必要があります.__all__と定義されていない限り、認識できません.

    from travel import *などのパケット名を書き込むと、*を使用するとエラーが発生します.
    from travel import *
    
    trip_to = vietnam.VietnamPackage()
    trip_to.detail()
    
    >     trip_to = vietnam.VietnamPackage()
    NameError: name 'vietnam' is not defined
    
    ツアーセットの__init__.pyに入ったら__all__を使用します.__all__ = ["모듈이름"]
    #__init__ 모듈에서 작성해줍니다.
    __all__ = ["vietnam"]
    もう一度印刷してみると、正常に動作していることがわかります.
    from travel import *
    
    trip_to = vietnam.VietnamPackage()
    trip_to.detail()
    
    > [배트남 패키지 35] 다낭 효도 여행 60만원