自学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 模块搜索路径

当导入一个模块时,解释器先在当前包中查找模块,若找不到,然后在内置的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 记录了导入模块的时候寻找的所有路径

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

 

......

自学Python5.2-类、模块、包的更多相关文章

  1. 自学Python5.3-内置模块(1)

    内置模块(1)内置模块是Python自带的功能,在使用内置模块相应的功能时,需要  先导入 再 使用  1.OS模块       用于提供系统级别的操作: os.getcwd() 获取当前工作目录,即 ...

  2. 自学Python5.4-内置模块(2)

    内置模块(2) 7. xml8.conf9.requests10.logging11.paramiko12.time & datetime 时间相关的操作,时间主要分三种表示方式: 时间戳   ...

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

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

  4. java中的对象、类、包、模块、组件、容器、框架、架构的概念入门

    在Java中有那么一些概念:对象.类.包.模块.组件.容器.框架.这些概念都有一个共同的特点,就是[容纳]. 对象(Object) 在Java的世界里,对象是通过属性和方法来分别对应事务所具有的静态属 ...

  5. 浅谈Perl的类、包、模块与面对对象编程

    http://blog.chinaunix.net/uid-27464093-id-3308003.html Perl面向对象 Perl面向对象学习例子实例代码教程 - 在我们了解perl的面向对象的 ...

  6. Docker+Cmd+Cli+Git之前端工程化纪要(二)自定义类package.json文件管理模块包

    全新升级后的FE工作流为:使用FE命令包进行项目的初始化,其中包括项目初始化.拉取脚手架.私库拉取模块包或后期扩展的CI/CD等与本公司工作流相关的操作. 出现的问题如下: 脚手架工具的包依赖信息存放 ...

  7. 自学Python5.1-面向对象与面向过程

    自学Python之路 自学Python5.1-面向对象与面向过程 面向过程:根据业务逻辑从上到下写代码. 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机.嵌入式开 ...

  8. 自学Python5.7-面向对象三大基本特征_封装

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

  9. 自学Python5.6-面向对象三大基本特征_多态

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

随机推荐

  1. Grafana+Prometheus系统监控之钉钉报警功能

    介绍 钉钉,阿里巴巴出品,专为中国企业打造的免费智能移动办公平台,含PC版,Web版和手机版.智能办公电话,消息已读未读,DING消息任务管理,让沟通更高效:移动办公考勤,签到,审批,企业邮箱,企业网 ...

  2. Spring ioc与aop的理解

    一 spring的特点 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易 ...

  3. c#读取Excel数据到Gridview

    #region 读取Excel数据到Gridview public void ReadExcel(string sExcelFile, GridView dgBom)    { DataTable E ...

  4. Cordic算法——圆周系统之旋转模式

    三角函数的计算是个复杂的主题,有计算机之前,人们通常通过查找三角函数表来计算任意角度的三角函数的值.这种表格在人们刚刚产生三角函数的概念的时候就已经有了,它们通常是通过从已知值(比如sin(π/2)= ...

  5. C#操作防火墙控制电脑某些软件联网

    问题: 目前公司软件刚由单机软件更改为联网软件,许多客户反映希望能够有一个功能来控制电脑上某些必用软件,如qq,公司软件联网,而其他不必要的如网页,游戏等软件不允许联网,于是向公司反映希望可以有一个功 ...

  6. SQL Server 基本操作之三种增加法

    前言: 数据库操作避免不了对数据的操作,操作方法大同小异,万变不离其宗,今就写一下各种花式操作的根本增删改查四种操作,今天我们就来说一下增加操作的三种方法 正文: 增加操作是对数据库进行数据行的添加, ...

  7. javac 实现原理

    javac 概述 javac 是jdk bin目录下的一个脚本. 用于编译 java程序的源代码,但是 其实现的本质 是基于 jdk 标准类库中的 javac类库实现,所以java的编译器实质上是一个 ...

  8. web离线应用--applicationCache

    applicationCache是html5新增的一个离线应用功能 离线浏览: 用户可以在离线状态下浏览网站内容. 更快的速度: 因为数据被存储在本地,所以速度会更快. 减轻服务器的负载: 浏览器只会 ...

  9. 面向对象编程 —— java实现函数求导

    文章目录 ★引子 ★求导 ★最初的想法 ★初步的想法 ★后来的想法 ★最后的想法 ★编程范式 ★结尾 首先声明一点,本文主要介绍的是面向对象(OO)的思想,顺便谈下函数式编程,而不是教你如何准确地.科 ...

  10. VMWare安装Win10虚拟机

    这两天突发奇想安了个win10虚拟机,在安装的过程中还遇到了不少麻烦,所以在此与大家分享下. 首先我们用VMWare12来安装,VMWare已经更新到14但是不太稳定,所以为了保险起见还是用12吧. ...