第50課:モジュール:モジュールはプログラムである

4041 ワード

内容はネットに由来し、本人はここで少し整理しただけで、著作権の問題があれば、小甲魚の公式所有に帰属します.
練習問題(小甲魚公式フォーラムから)
0.そもそもPythonのモジュールは何ですか?
モジュールはプログラムです.そう、モジュールとは普段私たちが書いたコードで、保存されているものです.pyの最後のファイルは、独立したモジュールです.
1.私たちは今helloを持っています.pyのファイルにはhi()関数があります.
def hi():
    print("Hi everyone, I love FishC.com!")

すみません、私はどのように別のソースファイルtestにいますか?pyの中でhelloを使います.pyのhi()関数は?回答:
#    
import hello
hello.hi()
#    
from hello import hi
hi()
#    
import hello as h
h.hi()

2.モジュールを導入する方法はいくつか知っていますか.
答え:三つ.上の問題の答えです.1つ目:importモジュール名;2つ目:fromモジュール名import関数名;3つ目:importモジュール名asの新しい名前(推奨).
3.fromを止める方法を話したことがありますが...import*はあなたの「プライバシー」属性をインポートしますが、どのようにしたか覚えていますか?
答え:モジュールの属性がfromにされたくない場合は...import*をインポートすると、インポートしたくない属性名の前に下線()を付けることができます.importを使用すると...モジュール全体をインポートすると、この非表示の方法は機能しません.
4.a.pyとb.pyの2つのファイルがある場合、内容は以下の通りです.
# a.py
def sayHi():
    print(" ,  A  ~")

# b.py
def sayHi():
    print(" ,  B  ~")

では、testにいます.pyファイルで以下の操作を実行すると、どのような結果が印刷されますか?
# test.py
from a import sayHi
from b import sayHi

sayHi()

答え:「はい、Bモジュールです~」と印刷されます.2回目にインポートされたbモジュールはaモジュールの同名関数を上書きするため,いわゆる額ネーミング空間の衝突である.だから、プロジェクト、特に大規模なプロジェクトではfromの使用を避けるべきです.import ...,名前の競合を起こさないことを明確にしない限り.
5.下のa.pyまたはb.pyのいずれかのファイルを実行すると、エラーが発生します.この現象を説明してみてください.
# a.py
from b import y
def x():
    print('x')

# b.py
from a import x
def y():
    print('y')

>>>
Traceback (most recent call last):
........
ImportError: cannot import name 'x'

答え:これはループネストインポートの問題です.a.pyとb.pyのどちらのファイルを実行しても、ImportError例外が放出されます.これは、あるファイル(a.py)のロード中にモジュールオブジェクトが作成され、対応するコードが実行されるためです.しかし、最初の文を実行するときに別のファイル(from b import y)をインポートする必要があるため、CPUは別のファイル(b.py)をロードします.同様に、別のファイルを実行する最初の文(from a import x)も、インポート前のファイル(a.py)が必要です.このとき,以前のファイルは第1の文のみをインポートする段階にあるため,対応する辞書にはxが存在しないため,例外が投げ出される.次のように変更します.
# a.py
import b
def x():
    print('x')

# b.py
import a
def y():
    print('y')

# test.py
a.x()
b.y()

プログラミング問題
0.Pythonは定数をサポートしていますか?多くの魚油の答えは否定的だと信じていますが、実際にPython内に建てられたネーミングスペースは定数の一部をサポートしています.例えば、私たちがよく知っているTrue、False、Noneなどですが、Pythonは定数を定義する直接的な方法を提供していません.では、この問題の要求はconstモジュールを作成することであり、Pythonが定数をサポートする機能である.
例を挙げると、テストコードは次のとおりです.
# const                
# const      Python      
import const

const.NAME = "FishC"
print(const.NAME)

try:
    #       
    const.NAME = "FishC.com"
except TypeError as Err:
    print(Err)

try:
    #        
    const.name = "FishC"
except TypeError as Err:
    print(Err)

実行後の結果は次のとおりです.
>>>
FishC
      !
            !

constモジュールで私たちはいったい何をして、このモジュールにこんなに「魔力」を持たせたのだろうか.皆さんは小さな甲魚のヒントに従って、一歩一歩やってみれば分かります.
  • ヒント1:Constクラス
  • が必要です
  • ヒント2:Constクラスを書き換える魔法の方法で、インスタンスオブジェクトの属性が変更されたときの動作
  • を指す.
  • ヒント3:
  • が存在するかどうかを確認します.
  • ヒント4:プロパティの名前が大文字であるかどうかを確認する
  • ヒント5:注意深い魚油が発見されたかもしれませんが、どうやってこのconstモジュールを導入してオブジェクトとして使用しますか(const.NAME=「FishC」)モジュールもオブジェクトになりますか?そう、Pythonではどこにでもいて、あなたの相手があちこちにいます.以下の方法で、あなたのモジュールをクラスAのオブジェクトにフックすることができます.
  • '''
    sys.models      ,     Python     ,        。      ,       。
    '''
    import sys
    sys.modules[__name__] = A()
    

    回答:
    #        Python      
    class Const:
        def __setattr__(self, name, value):
            if name in self.__dict__:
                raise TypeError('      !')
    
            if not name.isupper():
                raise TypeError('            !')
    
            self.__dict__[name] = value
    
    import sys
    sys.modules[__name__] = Const()
    

    1.この授業で学んだことを書いてください.フォーマットは限らず、思い出と復唱は記憶を強化する良い方法です.
  • モジュール1️⃣コンテナ→データのパッケージ2️⃣関数→文のカプセル化3️⃣クラス→メソッドとプロパティのパッケージ4️⃣モジュール→モジュールはプログラム
  • である.
  • ネーミングスペースPythonでは、各モジュールが独立したネーミングスペースを維持します.モジュール内の関数を正常に使用するには、モジュール名を追加する必要があります.
  • インポートモジュール1️⃣importモジュール名2️⃣fromモジュール名import関数名3️⃣importモジュール名as新名(推奨)