自学Python6.2-类、模块、包

自学Python之路-Python基础+模块+面向对象
自学Python之路-Python网络编程
自学Python之路-Python并发编程+数据库+前端
自学Python之路-django
html

自学Python6.2-类、模块、包

1、类

类的概念在许多语言中出现,很容易理解。它将数据和操做进行封装,以便未来的复用。前端

2、模块module

一般模块为一个文件,直接使用import来导入就行了。能够做为module的文件类型有".py"、".pyo"、".pyc"、".pyd"、".so"、".dll"。python

在建立了一个脚本文件后,定义了某些函数和变量,可重复调用。程序员

任何的python程序均可以做为模块。数据库

2.1 模块导入django

每一个模块都有本身的私有符号表,全部定义在模块里面的函数把它当作全局符号表使用。编程

模块能够导入其余的模块。一般将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(模块名),没有参数时返回全部当前定义的名字app

2.3 模块搜索路径

当导入一个模块时,解释器先在当前包中查找模块,若找不到,而后在内置的built-in模块中查找,找不到则按sys.path给定的路径找对应的模块文件(模块名.py)
sys.path的初始值来自于如下地方:
  •  包含脚本当前的路径,当前路径
  •  PYTHONPATH
  •  默认安装路径 
添加路径   append()或insert()增长新的目录。
#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 记录了导入模块的时候寻找的全部路径

3、包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被导入,而后导入定义在包中的全部名字。

3.3 从包中导入单独的模块

    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).    
绝对路径:
  • 无论在包内部仍是外部导入了就能用
  • 不能挪动,可是直观
相对路径
  • 能够随意移动包 只要能找到包的位置,就可使用包里的模块
  • 包里的模块若是想使用其它模块的内容只能使用相对路径,使用了相对路径就不能在包内直接执行了

 

 

 

 

......

相关文章
相关标签/搜索