Python中模块、包、库、框架的理解
一、模块以.py 文件开头的都叫做模块,模块中有定义的变量、函数、类。使用的时候import导入就行了二、包就是将模块整合打包到一个文件中,为了方便管理,包目录下有一个叫__init__.py文件。包里面还有模块,还可以有其他的子包,子包中的结构和包一样。下面给出了一个没有子包的包,可以看到有__init__.py文件和亮哥两个模块,其中__init__.py文件中一般放置的为如下的内容#! /u
一、模块(module)
以.py 文件开头的都叫做模块,模块中有定义的变量、函数、类。模块的名称为.py文件的名称,作为全局变量__name__的值。如果是模块A自己py A.py则__name__=‘main’,如果是被其他模块import之后使用的话,那么__name__=‘A’.
使用的时候import导入就行了,有以下几种方式:
①import
这种情况导入之后,使用内部的函数或者变量,需要前面加上模块名.函数或者变量
import pickle
import json
或者一行解决:
import pickle,json
推荐第一种,可读性好一些;
②from import
使用这种方式的话,直接使用就行了。
from datetime import *
还有一种方式:
from datetime import date,time,datetime,timedelta
建议使用下面一种.
③还有一种给导入的包起别名;
from datetime import date as s_date
print(s_date.today())
给date起了一个别名叫做:s_date
注意:使用import 模块之后,模块中的函数 类 以及变量的使用,需要前面加上模块名.,如果使用from 模块 import 函数 类 以及变量 ,则直接使用就行了,但是有一个弊端,就是当前模块中有相同名称的,会覆盖导入的名称.
对于from 模块名 import *这种方法是导入模块中的所有内容,如果模块中的内容很大,这样做对于代码执行的时候有影响,建议使用到什么导入什么,或者还有一种方法,在被导入的模块中加入如下一行代码:
from datetime import date as s_date
__all__ = ['x','test'] #加这一行之后,调用该模块的模块即使使用import *也不能使用类A的功能了.
print(s_date.today())
x = 1
def test():
return 0.0
print(test())
class A(object):
pass
导入模块的本质:
就是搜索模块对应的.py文件所在的路径下是否包含它,有的话就导入,没有的话就报错.
比如import A :就是找A.py文件,怎么找,去路径下找,去哪个路径下,sys.path路径下找,找不到就报错,可以通过如下代码查看sys.path路径,返回的是一个路径结果:
import sys
p = sys.path
运行结果:
['C:\\Users\\10270\\Desktop\\py_test', 'C:\\Users\\10270\\Desktop\\py_test', 'C:\\Users\\10270\\AppData\\Local\\Programs\\Python\\Python37\\python37.zip', 'C:\\Users\\10270\\AppData\\Local\\Programs\\Python\\Python37\\DLLs', 'C:\\Users\\10270\\AppData\\Local\\Programs\\Python\\Python37\\lib', 'C:\\Users\\10270\\AppData\\Local\\Programs\\Python\\Python37', 'C:\\Users\\10270\\Desktop\\py_test\\venv', 'C:\\Users\\10270\\Desktop\\py_test\\venv\\lib\\site-packages']
如果需要导入的模块路径不在这个列表中,则可以手动的添加:
sys.path.append("D:\test")
上面是已知模块的路径,如果在不知道模块路径的情况下,但是知道模块和当前执行模块的路径的上下级关系,可以通过如下代码将被导入的模块的路径添加到sys.path中:
假如a.py想导入b.py模块,它们之间的关系是,a.py的上一级目录f1和b.py在同一级目录下,f1和b.py在f目录下:
import sys
#__file__这个变量的值是当前模块的文件名
print(__file__)
path1 = os.path.abspath(__file__) #获取模块的绝对路径
path2 = os.path.dirname(path1)#获取绝对路径的上一级目录
path3 = os.path.dirname(path2)#获取path的上一级目录
sys.path.append(path3)
print(sys.path)
运行结果:
__file__:C:/Users/10270/Desktop/py_test/test_10_10.py
path1:C:\Users\10270\Desktop\py_test\test_10_10.py
path2:C:\Users\10270\Desktop\py_test
path3:C:\Users\10270\Desktop
['C:\\Users\\10270\\Desktop\\py_test', 'C:\\Users\\10270\\Desktop\\py_test', 'C:\\Users\\10270\\AppData\\Local\\Programs\\Python\\Python37\\python37.zip', 'C:\\Users\\10270\\AppData\\Local\\Programs\\Python\\Python37\\DLLs', 'C:\\Users\\10270\\AppData\\Local\\Programs\\Python\\Python37\\lib', 'C:\\Users\\10270\\AppData\\Local\\Programs\\Python\\Python37', 'C:\\Users\\10270\\Desktop\\py_test\\venv', 'C:\\Users\\10270\\Desktop\\py_test\\venv\\lib\\site-packages', 'C:\\Users\\10270\\Desktop'] #这个是新增加的
上面这样的操作其实会有个问题,就是如果列表中的某个路径下有相同名称的模块,那么找到了之后,就不会去我们添加的路径下去找,这样调用的话就会报错,可以通过指定添加的位置,将路径添加到sys.path中.
二、包(package)
为了方便管理,比如开发人员A和开发人员B分别开发不同功能的模块,如果起名相同的话,在项目中导入的话,名称相同无法判断是导入哪个模块,所以将多个模块打包到一个文件中,这个文件就叫做包,引用的话,直接在模块前加个包名,只要包不同,里面的模块名是可以重复的,包目录下有一个叫__init__.py文件.导入包的时候,该文件会被执行,文件中的内容其实就是import 模块。包里面有模块,还可以有其他的子包,子包中的结构和包一样。
下面给出了一个没有子包的包,可以看到有__init__.py文件和两个模块,其中__init__.py文件中一般放置的为如下的内容
#! /usr/bin/env python
# encoding:utf-8
from package_a import module_a1
from package_a import module_a2
如果A和B两个文件夹中分别有a.py和b.py,在a.py文件中想要import b模块,它们的父级目录相同,比如:D:/test/A 和D:/test/B,在a.py文件中直接执行:
print(sys.path)
如果结果中没有这个路径:
'D:\\test'
那么需要手动添加:
sys.path.append("D:\\test")
再次打印sys.path就会增加这个路径,再from B import b时就不会报错了;
导入包的时候,建议直接:
from 模块名 import 函数或者类
#不推荐
import 模块
#因为这种方法会每次模块中的函数,比如A.test(),都先去sys.path中找A.py的路径,然后再去导入,调用test()函数.
最上面那个,只需要一次导入,后面直接用test()
三、库(library)
Python中的库是借用其他编程语言的概念,没有特别具体的定义,Python库主要强调其功能性。在Python中,具有某些功能的模块和包都可以被称作库。模块由诸多函数组成,包由诸多模块结构化组成,库中也可以包含包、模块和函数。
库是具有相关功能模块的集合。
包括:标准库,第三方库,自定义库
标准库一般在安装了Python之后就自带了,比如sys
第三方库:是第三方机构开发的提供特定功能的模块,用户如果想使用的话,需要先在网上下载,然后在本地安装,安装之后就可以使用了。
自定义库:用户可以根据需求自己开发一些库。
四、框架(framework)
框架是Python库的集合。框架跟库类似,从功能上来说的,框架往往集成了多种库的功能,框架是用来辅助开发某个领域功能的一个包,一般包内还会含有多个子包。框架会方便开发,将某类项目中必须实现的代码直接实现,你只需要去关注你与别项目不同的部分。如爬虫框架scrapy、web开发框架Django和flask、大数据框架pyspark等。
贴上别人关于这个知识点写的比较好的文章,供自己和大家参考:
https://blog.csdn.net/weixin_41010198/article/details/117286655?spm=1001.2014.3001.5501
更多推荐
所有评论(0)