类的概念在许多语言中出现,很容易理解。它将数据和操作进行封装,以便将来的复用。
通常模块为一个文件,直接使用import来导入就好了。可以作为module的文件类型有".py"、".pyo"、".pyc"、".pyd"、".so"、".dll"。
通常包是一个目录,可以使用import导入包,或者from + import来导入包中的部分模块。包目录下为首的一个文件便是 __init__.py。然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。
#文件目录结构
module
|--main.py
|--spam.py
你可以使用import语句将一个源代码文件作为模块导入.例如:
# file : spam.py
a = 37 # 一个变量
def foo: # 一个函数
print "I'm foo"
class bar: # 一个类
def grok(self):
print "I'm bar.grok"
b = bar() # 创建一个实例
使用import spam 语句就可以将这个文件作为模块导入:
# file : main.py
import spam # 导入并运行模块 spam
print spam.a # 访问模块 spam 的属性
spam.foo()
c = spam.bar()
用逗号分割模块名称就可以同时导入多个模块,系统在导入模块时,做了以下三件事:
1.为源代码文件中定义的对象创建一个名字空间,通过这个名字空间可以访问到模块中定义的函数及变量;
2.在新创建的名字空间里执行源代码文件;
3.创建一个名为源代码文件的对象,该对象引用模块的名字空间,这样就可以通过这个对象访问模块中的函数及变量。
通常包总是一个目录,可以使用import导入包,或者from + import来导入包中的部分模块。包目录下为首的一个文件便是 __init__.py。然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。
包对应于文件夹,使用包的方式跟模块也类似,唯一需要注意的是,当文件夹当作包使用时,文件夹需要包含__init__.py文件,主要是为了避免将文件夹名当作普通的字符串。
__init__.py的内容可以为空,一般用来进行包的某些初始化工作或者设置__all__值,__all__是在from package import *这语句使用的,全部导出定义过的模块。
#文件目录结构
test
|--main.py
|--package
|--__init.py__
|--module_a.py
|--module_b.py
#file :module_a.py
def set():
print('module_a.py')
#file :module_b.py
def set():
print('module_b.py')
如果包的__init__.py定义了一个名为__all__的列表变量,from package import * 语句只能导入__all__列表中存在的对象(模块列表)。
如果包的__init__.py没有定义__all__, 这条语句不会导入任何package的子模块,它只保证包package被导入,然后导入定义在包中的所有名字。
例如:
# package: __init__.py #不为空
__all__ = [ 'module_a', 'module_b' ] # 定义使用 `*` 可以导入的模块
# file:main.py
from package import * #将导入module_a.py和module_b.py模块
module_a.set()
module_b.set()
===========================================================================
# package: __init__.py #为空
# 只保证包导入成功,不导入任何模块
# file:main.py
#如导入module_a.py和module_b.py模块需要:
from package import module_a,module_b
module_a.set()
module_b.set()
注:import package语句仅仅导入__init__.py文件(无论是否有__all__列表),都不导入__all__内的任何模块,
#当使用import package时,仅仅导入__init__.py文件;
#若要使用import package有两种方法;
#方法1:
from package import module_a
module_a.set() #使用module_a内函数的方法
#方法2:
import package.module_a
package.module_a.set() #使用module_a内函数的方法
另外:模块导入时可以使用 as 关键字来改变模块的引用对象名字:
import os as system
import socket as net, thread as threads
system.chdir("..")
net.gethostname()
文本多摘自:
https://blog.csdn.net/zyz511919766/article/details/22678143#
https://www.cnblogs.com/kex1n/p/5977051.html