Pythonモジュールが初期化されたときに何が起こりましたか?

hello.pyモジュールがあるとすると、他のモジュールからhello.pyを呼び出すとどうなりますか?

便宜上、ipythonを使用してhello.pyディレクトリにインポートしました。

hello.pyのコードは次のとおりで、モジュール変数、関数、クラス変数、クラス静的メソッド、クラスメソッド、インスタンスメソッドが含まれています。

# hello.py
print 'module value'
module_a = 233

def f():
    print 'func name:', f.__name__

class DoClass(object):
    print 'do class'
    c_value = 88
    @classmethod
    def cf(cls):
        print 'cf', cls.cf
    @staticmethod
    def sf():
        print 'sf', DoClass.sf.func_name
    def f(self):
        print self.f

hello.pyディレクトリでipythonを開き、結果を表示します。

In [1]: import sys

In [2]: sys.modules['hello']
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-2-ec73143594c2> in <module>()
----> 1 sys.modules['hello']

KeyError: 'hello'

helloモジュールがインポートされていない場合は、現時点ではシステムにそのようなモジュールがないことがわかります。インポートを実行してみましょう。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
In [3]: import hello
module value
do class

In [4]: sys.modules['hello']
Out[4]: <module 'hello' from 'hello.pyc'>

インポート後、モジュール内のモジュール変数とクラス変数が直接実行されていることがわかり、helloモジュールがシステム内にあることがわかります。この時点で、helloモジュールのプロパティを確認できます。

In [5]: dir(hello)
Out[5]:
['DoClass',
 '__builtins__',
 '__doc__',
 '__file__',
 '__name__',
 '__package__',
 'f',
 'module_a']

ご覧のとおり、モジュールには3つの属性があります。モジュール変数、関数、クラスです。この時点で、ipythonにhelloを再度インポートし、結果を表示します。

In [6]: import hello

In [7]:

モジュールは最初にインポートされたときにのみ実行されるため、現時点では何も出力されないことがわかりました。実際には、インポートされたモジュールを使用して新しいオブジェクトを生成できます。モジュール変数とクラス変数は、モジュールオブジェクトが初期化されるときに実行されますが、関数とクラスメソッドは、それらが呼び出されるときにのみ初期化時に実行されません。実行されます:

In [7]: hello.f()
func name: f

In [8]: hello.module_a
Out[8]: 233

In [9]: hello.DoClass
Out[9]: hello.DoClass

In [10]: hello.DoClass.c_value
Out[10]: 88

では、モジュールに他のモジュールをインポートしたり、他のモジュールをインポートしたりしたらどうなるでしょうか。

# hello.py
# -*- coding: utf-8 -*-
import math
from math import sqrt

モジュールに数学と数学のsqrtメソッドをインポートしてから、helloをインポートします。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
In [1]: import hello

In [2]: dir(hello)
Out[2]:
['__builtins__',
 '__doc__',
 '__file__',
 '__name__',
 '__package__',
 'math',
 'sqrt']

In [3]: hello.math
Out[3]: <module 'math' from '/usr/local/Cellar/python/3.6.8_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload/math.so'>

In [4]: hello.math.sqrt(100)
Out[4]: 10.0

In [5]: hello.sqrt(1000)
Out[5]: 31.622776601683793

ご覧のとおり、helloをインポートした後、helloにインポートされたmathおよびsqrtはhelloメソッドになりました。これは、モジュールで直接定義した変数と一致しています。

概要:モジュール内の他のモジュールのインポート、または変数、関数、クラスの直接定義に関係なく、モジュールが別のモジュールにインポートされると、これらの内容がモジュールの属性になります。これは実際にはPythonのすべてのものと一致しています。

おすすめ

転載: blog.csdn.net/sinat_38682860/article/details/108646449