python里面模块和包的区别是什么?

pycharm右键新建时会有目录(文件夹)和python package两个选项,这两个到底有什么不同呢

1.原来在python模块的每一个包中,都有一个__init__.py文件(这个文件定义了包的属性和方法)然后是一些模块文件和子目录,假如子目录中也有__init__.py那么它就是这个包的子包了。

当你将一个包作为模块导入(比如从 xml导入 dom)的时候,实际上导入了它的__init__.py 文件。

2.而目录跟包唯一不同的就是没有__init__.py 文件,一个包是一个带有特殊文件__init__.py 的目录,而__init__.py 文件定义了包的属性和方法。

其实它可以什么也不定义;可以只是一个空文件,但是必须存在。如果__init__.py 不存在,这个目录就仅仅是一个目录,而不是一个包,它就不能被导入或者包含其它的模块和嵌套包。

补充知识:Python类、模块、包的区别

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

模块,在Python可理解为对应于一个文件。在创建了一个脚本文件后,定义了某些函数和变量。你在其他需要这些功能的文件中,导入这模块,就可重用这些函数和变量。一般用module_name.fun_name,和module_name.var_name进行使用。这样的语义用法使模块看起来很像类或者名字空间,可将module_name 理解为名字限定符。模块名就是文件名去掉.py后缀。

 
 

模块属性__name__,它的值由Python解释器设定。如果脚本文件是作为主程序调用,其值就设为__main__,如果是作为模块被其他文件导入,它的值就是其文件名。

每个模块都有自己的私有符号表,所有定义在模块里面的函数把它当做全局符号表使用。

模块可以导入其他的模块。通常将import语句放在模块的开头,被导入的模块名字放在导入它的模块的符号表中。

from module import names 可以直接从模块中导入名字到符号表,但模块名字不会被导入。

from module import * 可以把模块中的所有名字全部导入,除了那些以下划线开头的名字符号。不建议使用,不清楚导入了什么符号,有可能覆盖自己定义的东西

内建函数dir()可以查看模块定义了什么名字(包括变量名,模块名,函数名等):dir(模块名),没有参数时返回所有当前定义的名字

当导入一个模块时,解释器先在当前包中查找模块,若找不到,然后在内置的built-in模块中查找,找不到则按sys.path给定的路径找对应的模块文件(模块名.py)

sys.path的初始值来自于以下地方:

包含脚本当前的路径,当前路径

sys.path初始化完成之后可以更改

上面的例子中,当client被导入后,python解释器就在当前目录下寻找client.py的文件,然后再从环境变量PYTHONPATH寻找,如果这环境变量没有设定,也不要紧,解释器还会在安装预先设定的的一些目录寻找。这就是在导入下面这些标准模块,一切美好事情能发生的原因。

这些搜索目录可在运行时动态改变,比如将module1.py不放在当前目录,而放在一个冷僻的角落里。这里你就需要通过某种途径,如sys.path,来告知Python了。sys.path返回的是模块搜索列表,通过前后的输出对比和代码,应能理悟到如何增加新路径的方法了吧。非常简单,就是使用list的append()或insert()增加新的目录。


  

模块能像包含函数定义一样,可包含一些可执行语句。这些可执行语句通常用来进行模块的初始化工作。这些语句只在模块第一次被导入时被执行。这非常重要,有些人以为这些语句会多次导入多次执行,其实不然。

模块在被导入执行时,python解释器为加快程序的启动速度,会在与模块文件同一目录下生成.pyc文件。我们知道python是解释性的脚本语言,而.pyc是经过编译后的字节码,这一工作会自动完成,而无需程序员手动执行。

通常包总是一个目录,可以使用import导入包,或者from + import来导入包中的部分模块。包目录下为首的一个文件便是 _init_.py。然后是一些模块文件和子目录,假如子目录中也有 _init_.py 那么它就是这个包的子包了。

在创建许许多多模块后,我们可能希望将某些功能相近的文件组织在同一文件夹下,这里就需要运用包的概念了。包对应于文件夹,使用包的方式跟模块也类似,唯一需要注意的是,当文件夹当作包使用时,文件夹需要包含__init__.py文件,主要是为了避免将文件夹名当作普通的字符串。_init_.py的内容可以为空,一般用来进行包的某些初始化工作或者设置__all__值,__all__是在from

可以从包中导入单独的模块。

当使用from package import item时,item可以是package的子模块或子包,或是其他的定义在包中的名字(比如一个函数、类或变量)

首先检查item是否定义在包中,不过没找到,就认为item是一个模块并尝试加载它,失败时会抛出一个ImportError异常。

当使用import item.subitem.subsubitem语法时,最后一个item之前的item必须是包,最后一个item可以是一个模块或包,但不能是类、函数和变量

如果包的__init__.py定义了一个名为__all__的列表变量,它包含的模块名字的列表将作为被导入的模块列表。

如果没有定义__all__, 这条语句不会导入所有的package的子模块,它只保证包package被导入,然后导入定义在包中的所有名字。

包是一个有层次的文件目录结构,它定义了由n个模块或n个子包组成的python应用程序执行环境。

通俗一点:包是一个包含__init__.py 文件的目录,该目录下一定得有这个__init__.py文件和其它模块或子包。

引入某一特定路径下的模块

将一个路径加入到python系统路径下,避免每次通过代码指定路径

多次import不会多次执行模块,只会执行一次。可以使用reload来强制运行模块,但不提倡。

为了组织好模块,将多个模块分为一个包。包是python模块文件所在的目录,且该目录下必须存在__init__.py文件。常见的包结构如下:

 

以上这篇浅谈Python中文件夹和python package包的区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

}

有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt函数,必须用语句#include 引入math.h这个头文件,否则是无法正常进行调用的。

那么在Python中,如果要引用一些其他的函数,该怎么处理呢?

在Python中有一个概念叫做模块(module),这个和C语言中的头文件以及Java中的包很类似,比如在Python中要调用sqrt函数,必须用import关键字引入math这个模块,下面就来了解一下Python中的模块。

说的通俗点:模块就好比是工具包,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块。

1.每一个以扩展名py结尾的python源代码文件都是一个模块。

2.模块名同样也是一个标识符,需要符合标识符的命名规范。

3.在模块中定义的全局变量、函数、类都是提供给外界直接使用的工具。

4.模块就好比工具包,要想使用这个工具包中的工具,就需要先导入这个模块。

在Python中用关键字import来引入某个模块,比如要引用模块math,就可以在文件最开始的地方用import math来引入。

说明:在导入模块时,每个导入应该独占一行(推荐)import 模块1

通过模块名使用模块提供的工具---全局变量、函数、类。

只用as指定模块的别名。

如果模块的名字太长,可以使用as指定模块的别名,以方便在代码中的使用。import 模块名1 as 模块别名

注意:模块别名应该符合托峰值命名规范

为什么要加上模块名呢?

因为可能存在这样一种情况:在多个模块中含有相同名称的函数,此时如果只是通过函数名来调用,解释器无法知道到底要调用哪个函数。所以如果像上述这样引入模块的时候,调用函数必须加上模块名。

1.如果想从某一模块中导入部分工具,就可以使用from...import的方式。

2.import模块名是一次性把模块中所有的工具全部导入,并且通过模块名/别名访问。#从模块中导入某一个工具

1.不需要通过模块名. 的方式使用模块提供的工具

2.可以直接使用模块提供的工具  --- 全局变量、函数、类

1.如果两个模块,存在同名的函数,name后导入模块的函数会覆盖先导入的函数

2.开发时import代码应该统一写在代码的顶部,更容易及时发现冲突

3.如果发生冲突,可以使用as关键字,给其中一个工具起一个别名from...import *

#从模块中导入所有工具

这种法师不推荐使用,因为函数重名并没有任何的提示,出现问题不好排查

test.py中使用demo.py模块#导入模块中的所有工具,同时为模块指定别名为myTest

#导入模块中所有工具,不推荐,工具同名不好排查

#为导入工具Cat类指定别名Test_Cat,防止与其他模块中工具重名

相关推荐:《Python视频教程》

四、python模块导入的搜索路

任何的.pth文件的内容(如果存在的话).新功能,允许用户把有效果的目录添加到模块搜索路径中去 .pth后缀的文本文件中一行一行的地列出目录。

这四个组建组合起来就变成了sys.path了,

当python import模块的时候,就通过sys.path里面的目录列表下面去查找。

#因为sys.path是一个列表,所以可以在后面追加一个自定的模块路径

#通过insert可以将路径插到前面

在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字。

在实际开中,当一个开发人员编写完一个模块后,为了让模块能够在项目中达到想要的效果,这个开发人员会自行在py文件中添加一些测试信息,例如:test.py文件def add(a,b):

如果此时,在demo.py文件中引入了此文件的话,想想看,测试的那段代码是否也会执行呢!import test

至此,可发现test.py中的测试代码,应该是单独执行test.py文件时才应该执行的,不应该是其他的文件中引用而执行。为了解决这个问题,python在执行一个文件时有个变量__name__

可以根据__name__变量的结果能够判断出,是直接执行的python脚本还是被引入执行的,从而能够有选择性的执行测试代码。

这样我们在开中测试的代码,就不会在其他模块中出现了。

如果一个文件中有__all__变量,那么也就意味着只有这个变量中的元素,才会被from xxx import *时导入。

七、系统sys模块介绍

sys是python自带模块,常用的函数有:

sys.argv: 实现从程序外部向程序传递参数。

sys.path: 获取指定模块搜索路径的字符串集合,可以将写好的模块放在得到的某个路径下,就可以在程序中import时正确找到。

sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个“外部”很关键。因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可以看作是一个列表,所以才能用[]提取其中的元素。其第一个元素是程序本身,随后才依次是外部给予的参数。

下面我们通过一个极简单的test.py程序的运行结果来说明它的用法。#test.py

将test.py保存在c盘的根目录下。

得到的结果是C:\test.py,这就是0指代码(即此.py程序)本身的意思。

然后我们将代码中0改为1 :

保存后,再从控制台窗口运行,这次我们加上一个参数,输入:test.py what#test.py

得到的结果就是我们输入的参数what,看到这里你是不是开始明白了呢。

那我们再把代码修改一下:

保存后,再从控制台窗台运行程序,这次多加几个参数,以空格隔开:

得到的结果为[‘b’, ’c’, ’d’, ’e’, ’f’]

应该大彻大悟了吧。Sys.argv[ ]其实就是一个列表,里边的项为用户输入的参数,关键就是要明白这参数是从程序外部输入的,而非代码本身的什么地方,要想看到它的效果就应该将程序保存了,从外部来运行程序并给出参数。

程序中间的退出, arg=0为正常退出

一般情况下执行到主程序末尾,解释器自动退出,但是如果需要中途退出程序,可以调用sys.exit函数,带有一个可选的整数参数返回给调用它的程序,表示你可以在主程序中捕获对sys.exit的调用。(0是正常退出,其他为异常)当然也可以用字符串参数,表示错误不成功的报错信息。import sys

程序首先打印hello,在执行exit(90),抛异常把90传给values,values在传进函数中执行,打印90程序退出。后面的”come?”因为已经退出所以不会被打印. 而此时如果把exitfunc函数里面的sys.exit(0)去掉,那么程序会继续执行到输出”come?”。

sys.modules是一个全局字典,该字典是python启动后就加载在内存中。每当程序员导入新的模块,sys.modules将自动记录该模块。当第二次再导入该模块时,python会直接到字典中查找,从而加快了程序运行的速度。它拥有字典所拥有的一切方法。import sys

}

其软件设计更加灵活,能够很好地支持代码复用和设计复用。
并且使得代码具有更好的可读性和可扩展性。

面向对象程序设计的思路:
比如生产一台计算机,不是按顺序生产每一个部件,而是分别生产各个部件,然后再将其组装起来,这些部件通过设计好的接口连接,以便协调工作。

现实生活的每个相对独立的事物都可以看作一个对象。如一个人,一辆车
对象是具有某些特性和功能的具体事物的抽象。都具有描述其特征的属性及附属于它的行为。如一辆车有颜色等属性,一个人有姓名等属性。

每个对象都有一个类,类是创建对象实例的模板,是对对象的抽象和概括。
它包含对所创建对象的属性描述和行为特征的定义。

创建类时用变量形式表示的对象属性称为数据成员或属性(成员变量)。
用函数形式表示的对象行为称为成员函数(成员方法)。
成员属性和成员方法统称为类的成员。

对象 = 属性(特征) + 方法(行为)

python中具有相同属性和方法的对象归为一个类(class)

类是对象的抽象化,对象是类的实例化。

所有类都有一个名为__init__()的函数,它始终在启动类时执行。
使用__init__()函数将值赋给对象属性。

对象也可以包含方法。对象中的方法属于该对象的函数。

内置函数:python内嵌的一些函数

 匿名函数:一行代码实现一个函数功能
 递归函数:直接或间接调用函数本身的函数
 普通方法:直接用self调用的方法
 私有方法:_函数名,只能在类中被调用的方法
 属性方法:@property,将方法伪装成为属性,让代码看起来更合理
 特殊方法(双下划线):用来封装实例化对象的属性,如__init__
 类方法:通过类名的调用去操作公共模板中的属性和方法
 静态方法:不用传入类空间、对象的方法。 可以完全独立类外的一个方法,但是为了代码的一致性统一的放到某个模块(py文件)中
 从函数调用开始至函数执行完成,返回给调用者后,在执行过程中开辟的空间会自动释放。
 也就是说函数执行完成后,函数体内部通过赋值等方式修改变量的值不会保留,会随着返回给调用者后,开辟的空间会自动释放。
 通过实例化的对象进行方法的调用,调用后开辟的空间不会释放。也就是说调用方法中对变量的修改值会一直保留。

函数:通过“函数名()”的方式进行调用。
方法:通过“对象.方法名”的方式进行调用。

 在模块之上的概念,为了方便管理而将文件进行打包。
 包目录下第一个文件便是 __init__.py,然后是一些模块文件和子目录,假如子目录中也有 __init__.py,那么它就是这个包的子包
 就是.py文件,里面定义了一些函数和变量,需要的时候就可以导入这些模块。
 具有相关功能模块的集合。分为标准库、第三方库以及自定义模块
 标准库:就是下载安装的python里那些自带的模块(python安装后自带的库)
 第三方库:就是由其他的第三方机构,发布的具有特定功能的模块(python安装后需要下载安装的库)
 自定义模块:用户自己可以自行编写模块,然后使用。
}

我要回帖

更多关于 python模块大全 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信