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のすべてのものと一致しています。