自学Python6.2-类、模块、包
自学Python之路-Python基础+模块+面向对象
自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django
自学Python6.2-类、模块、包
一、类
类的概念在许多语言中出现,很容易理解。它将数据和操作进行封装,以便将来的复用。
二、模块module
通常模块为一个文件,直接使用import来导入就好了。可以作为module的文件类型有".py"、".pyo"、".pyc"、".pyd"、".so"、".dll"。
在创建了一个脚本文件后,定义了某些函数和变量,可重复调用。
任何的python程序都可以作为模块。
2.1 模块导入
每个模块都有自己的私有符号表,所有定义在模块里面的函数把它当做全局符号表使用。
模块可以导入其他的模块。通常将import语句放在模块的开头,被导入的模块名字放在导入它的模块的符号表中。
from module import names #可以直接从模块中导入名字到符号表,但模块名字不会被导入。
from module import * #可以把模块中的所有名字全部导入,除了那些以下划线开头的名字符号(不建议使用)。
- 为源代码文件中定义的对象创建一个名字空间,通过这个名字空间可以访问到模块中定义的函数及变量
 - 在新创建的名字空间里执行源代码文件.
 - 创建一个名为源代码文件的对象,该对象引用模块的名字空间,这样就可以通过这个对象访问模块中的函数及变量
 
import socket, os, regex #用逗号分割模块名称就可以同时导入多个模块
import socket as net, thread as threads #模块导入时可以使用 as 关键字来改变模块的引用对象名字
from socket import gethostname #使用from语句可以将模块中的对象直接导入到当前的名字空间. from语句不创建一个到模块名字空间的引用对象,而是把被导入模块的一个或多个对象直接放入当前的名字空间
from socket import gethostname, socket from #from支持逗号分割的对象
from socket import * #载入所有对象到当前名字空间,只能导入__all__列表中存在的对象
from socket import gethostname as hostname #as 和 from 联合使用 只能用于一个模块的最顶层
2.2 查看模块
内建函数dir()可以查看模块定义了什么名字(包括变量名,模块名,函数名等):dir(模块名),没有参数时返回所有当前定义的名字
2.3 模块搜索路径
- 包含脚本当前的路径,当前路径
 - PYTHONPATH
 - 默认安装路径
 
#module2.py
import sys
import os print sys.path
workpath = os.path.dirname(os.path.abspath(sys.argv[0]))
sys.path.insert(0, os.path.join(workpath, 'modules'))
print sys.path
2.3 其他的要点
模块能像包含函数定义一样,可包含一些可执行语句。这些可执行语句通常用来进行模块的初始化工作。这些语句只在模块第一次被导入时被执行。这非常重要,有些人以为这些语句会多次导入多次执行,其实不然。
模块在被导入执行时,python解释器为加快程序的启动速度,会在与模块文件同一目录下生成.pyc文件。我们知道python是解释性的脚本语言,而.pyc是经过编译后的字节码,这一工作会自动完成,而无需程序员手动执行。
- sys.modles记录了所有被导入的模块(一个模块被导入之后不会再被导入)
 - sys.path 记录了导入模块的时候寻找的所有路径
 
三、包package
3.1 通常包总是一个目录,可以使用import导入包,或者from + import来导入包中的部分模块(把解决一类问题的模块放在同一个文件夹里,这个文件夹就是“包”)。
包目录下为首的一个文件便是 __init__.py , 然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。(但是在python3里面没有__init__.py也不会出问题,但是在python2.7里面就不可以。)
 (__init__.py文件,主要是为了避免将文件夹名当作普通的字符串。__init__.py的内容可以为空,一般用来进行包的某些初始化工作或者设置__all__值,__all__是在from package-name import *这语句使用的,全部导出定义过的模块。)
结构如下:
3.2 import语句语法:
遵循原则:凡是在导入时带点的,点的左边必须是一个包。
from package import item
item可以是package的子模块或子包,或是其他的定义在包中的名字(比如一个函数、类或变量)
   首先检查item是否定义在包中,不过没找到,就认为item是一个模块并尝试加载它,失败时会抛出一个ImportError异常。
import item.subitem.subsubitem
最后一个item之前的item必须是包,最后一个item可以是一个模块或包,但不能是类、函数和变量
from pacakge import *
如果包的__init__.py定义了一个名为__all__的列表变量,它包含的模块名字的列表将作为被导入的模块列表。  
    如果没有定义__all__, 这条语句不会导入所有的package的子模块,它只保证包package被导入,然后导入定义在包中的所有名字。
import PackageA.SubPackageA.ModuleA 使用时必须用全路径名
from PackageA.SubPackageA import ModuleA 可以直接使用模块名而不用加上包前缀
from PackageA.SubPackageA.ModuleA import functionA 直接导入模块中的函数或变量
import Graphics.Primitive.fill #导入模块Graphics.Primitive.fill,只能以全名访问模块属性,例如 Graphics.Primitive.fill.floodfill(img,x,y,color).
from Graphics.Primitive import fill # 导入模块fill ,只能以 fill.属性名这种方式访问模块属性,例如 fill.floodfill(img,x,y,color).
from Graphics.Primitive.fill import floodfill #导入模块fill ,并将函数floodfill放入当前名称空间,直接访问被导入的属性,例如 floodfill(img,x,y,color).
绝对路径:
- 不管在包内部还是外部导入了就能用
 - 不能挪动,但是直观
 
相对路径
- 可以随意移动包 只要能找到包的位置,就可以使用包里的模块
 - 包里的模块如果想使用其它模块的内容只能使用相对路径,使用了相对路径就不能在包内直接执行了
 
......
自学Python6.2-类、模块、包的更多相关文章
- 自学Python6.3-内置模块(1)
		
自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...
 - 自学Python6.4-内置模块(2)
		
自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...
 - 自学Python6.5-内置模块(re、collections )
		
自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...
 - 自学Python5.2-类、模块、包
		
类.模块.包 一.类 类的概念在许多语言中出现,很容易理解.它将数据和操作进行封装,以便将来的复用. 二.模块module 通常模块为一个文件,直接使用import来导入就好了.可以作为module ...
 - 自学Python5.3-内置模块(1)
		
内置模块(1)内置模块是Python自带的功能,在使用内置模块相应的功能时,需要 先导入 再 使用 1.OS模块 用于提供系统级别的操作: os.getcwd() 获取当前工作目录,即 ...
 - 自学Python5.4-内置模块(2)
		
内置模块(2) 7. xml8.conf9.requests10.logging11.paramiko12.time & datetime 时间相关的操作,时间主要分三种表示方式: 时间戳 ...
 - java中的对象、类、包、模块、组件、容器、框架、架构的概念入门
		
在Java中有那么一些概念:对象.类.包.模块.组件.容器.框架.这些概念都有一个共同的特点,就是[容纳]. 对象(Object) 在Java的世界里,对象是通过属性和方法来分别对应事务所具有的静态属 ...
 - 浅谈Perl的类、包、模块与面对对象编程
		
http://blog.chinaunix.net/uid-27464093-id-3308003.html Perl面向对象 Perl面向对象学习例子实例代码教程 - 在我们了解perl的面向对象的 ...
 - Docker+Cmd+Cli+Git之前端工程化纪要(二)自定义类package.json文件管理模块包
		
全新升级后的FE工作流为:使用FE命令包进行项目的初始化,其中包括项目初始化.拉取脚手架.私库拉取模块包或后期扩展的CI/CD等与本公司工作流相关的操作. 出现的问题如下: 脚手架工具的包依赖信息存放 ...
 
随机推荐
- SPOJ33&POJ1934 Trip LCS
			
题目传送门:https://www.luogu.org/problemnew/show/SP33 题目大意:给出两个字符串,求其LCS(最长公共子序列)的长度与具体方案(相同的串算作同一方案).数据组 ...
 - 微信小程序日常开发中常遇到的错误代码
			
在开发过程中,会遇到很多微信返回的状态码,鬼知道代表什么意思,现在好了,整理总结了一份状态码,方便大家. 微信小程序错误码参考 状态码(场景值) 说明 -1 系统繁忙 0 请求成功 40001 ...
 - Luogu P2257 YY的GCD
			
莫比乌斯反演第一题.莫比乌斯反演入门 数论题不多BB,直接推导吧. 首先,发现题目所求\(ans=\sum_{i=1}^n\sum_{j=1}^m [\gcd(i,j)=prime]\) 考虑反演,我 ...
 - 洛谷 4823 [TJOI2013]拯救小矮人
			
题目链接-> 噔楞 题解: 贪心 按个高+臂长排序. 个矮臂长的先走,个高臂短的后走 #include <cstdio> #include <cstring> #incl ...
 - VS2017一步一步断点调试解决Dapper语句出现的Bug
			
最近再做一个项目,出现一个小bug,bug虽小,但是却要命啊.下面我show下我解决问题的方法. View层代码: @model List<mhq.Blog.Model.Blog> < ...
 - Mvc_model实体数据验证
			
MVC提供了很方便的数据验证,只需要在model里加入相关的正则等,那么就会在前台里生成相关的验证脚本.需要引用两个js文件: jquery.validate.min.js jquery.valida ...
 - Authorize的Forms认证
			
页面请求步骤: 1.登录地址: http://localhost:4441/SysLogin/AdminLogin 2.登陆成功地址:http://localhost:4441/Frame/MainF ...
 - 牛客训练赛25-A-因数个数
			
题目链接https://www.nowcoder.com/acm/contest/158/A 无语...这题很迷啊,原谅我的菜,刚开始想用预处理欧拉筛和前缀和,可是这题太血崩了,这样一样要遍历,1-e ...
 - 成功安装的Sublime Text3
			
安装指南 1:下载官网:https://www.sublimetext.com/3 2:安装指南:https://jingyan.baidu.com/article/b0b63dbfe1b8ff4a4 ...
 - Hitchhiker 是一款开源的 Restful Api 测试工具
			
Hitchhiker 是一款开源的 Restful Api 测试工具 开源API测试工具 Hitchhiker v0.4更新 - 没有做不到,只有想不到 Hitchhiker 是一款开源的 Restf ...