Python学习笔记(十七):关于包和模块

Python学习笔记(十七):关于包和模块

一.包

包是存放多个模块的文件夹,作用是包含多个模块,本质依然是模块,所以包中也可以包含包

库:相比模块和包,库是一个更大的概念,在Python标准库中的每个库都有好多个包,而每个包中都有若干个模块

每个包的目录下都必须建立一个__init__.py 的模块,作用是告诉 Python 要将该目录当成包来处理

包的定义

定义包:
创建一个文件夹,文件夹的名字就是该包的包名
在该文件夹内添加一个 __init__.py 文件,此文件中可以不编写任何代码
先新建一个test文件夹,在文件夹中添加一个 __init__.py 文件:
#该包的说明文档
'''
这是一个简单的包 
'''
print('这是一个简单的包')

使用该包
import test
print(test.__doc__)
print(type(test))
print(test)
这是一个简单的包

这是一个简单的包 

<class 'module'>
<module 'test' from 'C:/Users/Administrator/Desktop/2021-1-14\\test\\__init__.py'>

导入包的本质就是加载井执行该包下的 __init__.py 文件,将整个文件内容赋值给与包同名的变量,该变量的类型是 module

包被导入之后,会在包目录下生成一个 __pycache__ 文件夹,并在该文件夹内为包生成一个 __init__.cpython-36.pyc 文件

导入包就相当于导入该包下的 __init__.py 文件,包的主要作用是包含多个模块,__init__.py 文件的主要作用就是导入该包内的其他模块

包的导入

创建好包之后,可以向包中添加模块(或者包),这里给test包添加模块,分别为module1.py、module2.py

#module1.py模块文件
def display(arc):
    print(arc)
    
#module2.py 模块文件
class TEST:
    def display(self):
        print("youchanwill")
        
所设置的包的结构
    test
     ┠__init__.py
     ┠module1.py
     ┗module2.py

包的本质就是模块,导入模块时,当前程序中会包含一个和模块名同名且类型为 module 的变量,导入包也是如此

import 包名

import 包名[.模块名 [as 别名]]

导入 module1 模块并使用该模块中成员
import test.module1
test.module1.display("youchanwill.com")

这是一个简单的包
youchanwill.com

此语法格式导入包中的指定模块后,在使用该模块中的成员(变量、函数、类)时,需添加“包名.模块名”为前缀

使用 as 给包名.模块名”起一个别名,就直接使用这个别名作为前缀使用该模块中的方法

import test.module1 as module
module.display("youchanwill.com")

这是一个简单的包
youchanwill.com

直接导入指定包时,会自动执行该包所对应文件夹下的 __init__.py 文件中的代码

直接导入包名,并不会将包中所有模块全部导入到程序中,作用仅仅是导入并执行包下的 __init__.py 文件

from 包名 import

from 包名 import 模块名 [as 别名]

from test import module1
module1.display("youchanwill.net")

这是一个简单的包
youchanwill.net

此语法格式导入包中模块后,在使用其成员时不需要带包名前缀,但需要带模块名前缀

可以使用 as 为导入的指定模块定义别名

from test import module1 as module
module.display("youchanwill.net")

这是一个简单的包
youchanwill.net

from 包名 import *import 包名 的作用一样,都只是将该包的 __init__.py 文件导入并执行

from 包名.模块名 import

from 包名.模块名 import 成员名 [as 别名]

该方式导入的变量(函数、类),在使用时可以直接使用变量名(函数名、类名)调用

from test.module1 import display
display("chanwill.com")

这是一个简单的包
chanwill.com

使用 as 为导入的成员起一个别名

from test.module1 import dis
dis("chanwill.com")

这是一个简单的包
chanwill.com

此语法格式加载指定包的指定模块时,可以使用 * 代替成员名,表示加载该模块下的所有成员

from test.module1 import *
display("you")

二.查看模块成员

dir()函数

dir() 函数,可以查看某指定模块包含的全部成员(包括变量、函数和类)

这里的全部成员,不仅包含可供调用的模块成员,还包含所有名称以双下划线“__”开头和结尾的成员(在本模块中使用,不希望被其它文件调用)
通过 dir() 函数查看string模块中包含哪些成员

import string
print(dir(string))
['ChainMap', 'Formatter', 'Template', '_TemplateMetaclass', '__builtins__', '__cached__', '__doc__', '__file__'...
忽略显示 dir() 函数输出的特殊成员

import string
print([e for e in dir(string) if not e.startswith('_')])

通过列表推导式,可在 dir() 函数输出结果的基础上,筛选出有用的成员并显示

__all__变量

使用 __all__ 变量,查看模块(包)内包含的所有成员

import string
print(string.__all__)

__all__ 变量在查看指定模块成员时,不会显示模块中的特殊成员,同时还会根据成员的名称进行排序显示

*并非所有的模块都支持使用 __all __ 变量,对于获取有些模块的成员,就只能使用 dir() 函数

三.__doc__属性

help() 函数获取指定成员(模块)的帮助信息

先使用dir() 函数,查看test包中有多少可供调用的成员

from test.module1 import *
from test.module2 import *
import test
print([e for e in dir(test) if not e.startswith('_')])
['module1', 'module2']help() 函数查成员的具体含义

import test
from test.module1 import *
help(test.module1)
这是一个简单的包
Help on module test.module1 in test:

NAME
    test.module1

FUNCTIONS
    display(arc)

FILE
    c:\users\administrator\desktop\2021-1-14\test\module1.py
help() 函数查看具体成员的信息,该成员本身就包含表示自身身份的说明文档(字符串,位于该成员内部开头的位置),无论是函数还是类或者模块,都可以使用__doc__属性获取它们的说明文档

用 __doc__ 变量获取说明文档

import test
help(test..__doc__)

'这是一个简单的包'
help() 函数底层是借助 __doc__ 属性实现的

如果用help() 函数或__doc__属性,仍然无法满足需求:

调用__file__ 属性,查看该模块或者包文件的具体存储位置,直接查看其源代码

对于非自定义的模块或者包,可以查阅 Python 库的参考文档 

Python库的参考文档:The Python Standard Library

四.__file__属性

通过__file__属性查找该模块(或包)文件所在的具体存储位置,直接查看其源代码

import test
print(test.__file__)
C:\Users\Administrator\Desktop\2021-1-14\test\__init__.py

导入test包时,其实际上执行__init__.py文件,所以这里查看test包的存储路径,输出__init__.py文件的存储路径

import string
print(string.__file__)
F:\Python\lib\string.py

通过调用__file__ 属性输出的绝对路径,可以轻易找到该模块(或包)的源文件

并不是所有模块都提供__file__属性,因为不是所有模块都采用Python,有些模块采用的是其它编程语言
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值