zoukankan      html  css  js  c++  java
  • 自学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 模块搜索路径

    当导入一个模块时,解释器先在当前包中查找模块,若找不到,然后在内置的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).    
    绝对路径:
    • 不管在包内部还是外部导入了就能用
    • 不能挪动,但是直观
    相对路径
    • 可以随意移动包 只要能找到包的位置,就可以使用包里的模块
    • 包里的模块如果想使用其它模块的内容只能使用相对路径,使用了相对路径就不能在包内直接执行了

     

    ......

  • 相关阅读:
    JavaScript面向对象基础语法总结
    json对象
    关于JavaScript语法的小笔记
    关于JavaScript的小笔记
    html中的a标签的target属性的四个值的区别?
    详解Bootstrap 定义按钮的样式(CSS)
    (负)-margin在页面布局中的应用
    lorem ipsum text占位符
    jQuery动态添加元素事件
    实用|从0到1 搭建Web性能监控系统
  • 原文地址:https://www.cnblogs.com/yaoyaojcy/p/7421131.html
Copyright © 2011-2022 走看看