python中可以import的有module和package:
1、module 模块
通常模块为一个文件,直接使用 import 文件名 就可以导入。可以作为module的文件类型有".py"、".pyo"、".pyc"、".pyd"、".so"、".dll"。
2、package 包
通常包总是一个目录,包目录下需要有一个名为 __init__.py的文件。可以使用import导入包,或者from + import来导入包中的部分模块。包中可以有模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。
3、导入模块的原理
假设有一个文件 people.py,
# file : people.py
a = 37 # 一个变量
def name: # 一个函数
print("I'm Tom")
class Speak: # 一个类
def wisper(self):
print("I'm wisper speak")
b = speak() # 创建一个实例
3.1 我们可以使用import people 把people.py作为模块导入。python 解释器在执行到这一行时会做如下事情:
1)、为people.py中定义的对象创建一个命名空间,通过这个命名空间可以方位代码中的函数和变量
2)、在命名空间中执行代码。即导入的过程也是执行的过程。
3)、创建一个名为源代码文件的对象,该对象引用模块的名字空间,这样就可以通过这个对象访问模块中的函数及变量。如:
import people # 导入并运行模块 people
print people.a # 访问模块 people 的属性
people.name()
c = people.Speak()
3.2 我们还可以使用 from people import Speak的方式导入,from语句不创建一个到模块名字空间的引用对象,而是把被导入模块的一个或多个对象直接放入当前的名字空间。
from socket import gethostname
# 将gethostname放如当前名字空间
print gethostname() # 直接调用
socket.gethostname() # 引发异常NameError: socket
3.3 用逗号分割模块名称就可以同时导入多个模块:
import socket, os, regex
3.4 模块导入时可以使用 as 关键字来改变模块的引用对象名字:
import os as system
import socket as net, thread as threads
system.chdir("..")
net.gethostname()
3.5 可以在模块中定义__all__,使用from module import * 语句导入__all__列表中存在的对象
from语句支持使用星号(*)代表模块中除下划线开头的所有对象:
from socket import gethostname, socket
from socket import * # 载入所有对象到当前名字空间
# module: foo.py
__all__ = [ 'bar', 'spam' ] # 定义使用 `*` 可以导入的对象
3.6 内置方法
导入模块时,解释器会搜索sys.path列表,sys.path包含了module的查找路径;
sys.modules包含了当前所load的所有的modules的dict(其中包含了builtin的modules)
每个模块都拥有 __name__ 属性,它是一个内容为模块名字的字符串。
import sys
print(sys.path)
print(sys.modules)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。