ホームページ > バックエンド開発 > Python チュートリアル > Pythonのパッケージとは何ですか?効果は何ですか? Python のパッケージの紹介

Pythonのパッケージとは何ですか?効果は何ですか? Python のパッケージの紹介

不言
リリース: 2018-11-20 16:10:57
転載
7546 人が閲覧しました

この記事では、Python のパッケージとは何ですか?効果は何ですか? Python でのパッケージの紹介はある程度の参考になるので、困っている友達は参考にしていただければ幸いです。

1. パッケージとは何ですか?

パッケージとは、Python モジュールの名前空間を「.モジュール名」で整理する方法です。

#ただし、python2 で指定されていることに注意してください。パッケージ内に __init__.py ファイルが存在する必要があります。

目的パッケージの作成は実行することではなく、インポートして使用することです。パッケージは単なる形式であり、パッケージの本質はモジュールです。

2. パッケージの役割は何ですか?

パッケージ 本質的にはフォルダーであるため、フォルダーの唯一の機能はファイルを整理することです。関数が増えるにつれて、

#すべての関数を 1 つのフォルダーに入れることはできなくなります。モジュールを組織機能に使用します。モジュールが増えるにつれて、プログラムの構造と保守性を向上させるために、フォルダーを使用してモジュール ファイルを整理する必要があります。

次へ 後で学習するためにいくつかのパッケージを作成します。パッケージは簡単です。必要なのは __init__.py を含むフォルダーだけです。

import os
os.makedirs('glance/api')
os.makedirs('glance/cmd')
os.makedirs('glance/db')
l = []
l.append(open('glance/__init__.py','w'))
l.append(open('glance/api/__init__.py','w'))
l.append(open('glance/api/policy.py','w'))
l.append(open('glance/api/versions.py','w'))
l.append(open('glance/cmd/__init__.py','w'))
l.append(open('glance/cmd/manage.py','w'))
l.append(open('glance/db/__init__.py','w'))
l.append(open('glance/db/models.py','w'))
map(lambda f:f.close() ,l)
ログイン後にコピー

ディレクトリ構造を作成します

各フォルダーにいくつかのメソッドを追加します。
#policy.py
def get():
    print('from policy.py')
    
#versions.py
def create_resource(conf):
    print('from version.py: ',conf)
    
#manage.py
def main():
    print('from manage.py')
    
#models.py
def register_models(engine):
    print('from models.py: ',engine)
ログイン後にコピー

test.py でパッケージの内容を使用でき、パッケージをインポートするときに import または from xxx を使用できます。インポートの形式 xxx

import glance.db.models
glance.db.models.register_models('mysql')
from glance.api.policy import get
get()
ログイン後にコピー

ただし、次の形式に注意してください。 from xxx import xxx の「ドット」はインポート後に表示できません。つまり、from a.b import c は OK です。

しかし from a import b.c は間違っています

3 __init__.py は何をしますか?

パッケージのインポートにどの方法を使用しても、それが初めてインポートされる限り、パッケージまたはパッケージの他の部分が最初にインポートされます。 __init__.py ファイルを実行します。

このファイルは空でも構いませんが、初期化コードを保存することもできます。

以前に使用した Can from xxx import * be used in package call?

はい、__init__.py ファイルに __all__ を指定して * インポートされたコンテンツを決定する必要があります。

print("我是glance的__init__.py⽂件. ")
x = 10
def hehe():
    print("我是呵呵")
    
def haha():
    print("我是哈哈")
__all__ = ['x', "hehe"]
ログイン後にコピー

test.py

from glance import *
print(x) # OK
hehe() # OK
haha() # 报错. __all__⾥没有这个⻤东⻄
ログイン後にコピー

4. 相対インポートと絶対インポート

最終パッケージの Glance は他の人が使用できるように書かれており、Glance パッケージ内での相互インポートも行われます。現時点では、絶対インポートと相対インポートの 2 つのインポート方法があります。

1). 絶対インポート: 開始点として目で見る

2). 相対インポート: 使用. または. 開始点として

たとえば、glance/cmd/manage.py を使用します。 Inlance/api/version.py

# 在glance/api/version.py
#绝对导⼊
from glance.cmd import manage
manage.main()
#相对导⼊
# 这种情形不可以在versions中启动程序.
# attempted relative import beyond top-level package
from ..cmd import manage
manage.main()
ログイン後にコピー

テスト時に注意する必要があるのは、Python パッケージのパスが実行中のスクリプトが配置されているディレクトリと同じであることです。

Python では、実行するプログラムは、現在のパッケージのスコープを超えることはできません (相対インポート)。

絶対インポートを使用する場合、そのような問題はありません。つまり、パッケージで相対インポートを使用する場合、パッケージ内の情報を使用する場合、パッケージの外部でのみインポートできます。

# 在policy.py
import versions
ログイン後にコピー

プログラムのエントリがポリシーの場合、この時点ではプログラムに問題はありません。

理由は、ポリシー設定時に外部からアクセスするとエラーが発生するためです。 , .sys.path のパスが外部にあるため、versions モジュールを直接見つけることができません。したがって、必ずエラーが報告されます:

ModuleNotFoundError: No module named 'versions'
ログイン後にコピー
インポート中にエラーが発生した場合パッケージについては、まず sys.path を確認してください。本当にパッケージ情報を取得できるかどうかを確認してください。5. パッケージを個別にインポートします
# 在test.py中
import glance
ログイン後にコピー
インポートされたグランスでは、現時点では何もできません. なぜなら、一見すると __init__.py にはサブパッケージの読み込みがありません。この時点で、サブパッケージの内容をそれぞれ __init__.py に導入する必要があります。

1. 相対パスを使用する

2.

パッケージへの絶対パスを使用する場合の注意:

パッケージに関連するインポート ステートメントも import および from xxx import xxx ですが、どちらを使用しても、どこにあるとしても、インポートするときは 1 つの原則に従う必要があります: ドットを含むインポートでは、

ドットの左側がパッケージである必要があります。そうでない場合は、エラーが報告されます。一連のドット例: from a.b.c import d

以上がPythonのパッケージとは何ですか?効果は何ですか? Python のパッケージの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:cnblogs.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート