共计 4659 个字符,预计需要花费 12 分钟才能阅读完成。
1. 模块
- 一个模块就是一个蕴含 python 代码的文件,后缀名称是.py 就能够,模块就是个 python 文件
-
为什么咱们用模块
- 程序太大,编写保护十分不不便,须要拆分
- 模块能够减少代码反复利用的办法
- 当作命名空间应用,防止命名抵触
-
如何定义模块
- 模块就是一个一般文件,所以任何代码能够间接书写
-
不过依据模块的标准,最好在本块中编写以下内容
- 函数(繁多性能)- 类(类似性能的组合,或者相似业务模块)- 测试代码
-
如何应用模块
-
模块间接导入
- 模块名称间接以数字结尾,须要借助 importlib 帮忙
-
语法
import module_name module_name.function_name module_name.class_name
-
案例 01.py,02.py,p01.py,p02.py
# 案例 01.py # 蕴含一个学生类 # 一个 sayHello 函数 # 一个打印语句 class Student(): def __init__(self, name = "NoName", age = 18): self.name = name self.age = age def say(self): print("My name is {0}".format(self.name)) def sayHello(): print("Hi,") print("我是模块 p0")
# 案例 02.py # 借助于 importlib 包能够实现导入以数字结尾的模块名称 import importlib # 相当于导入了一个叫 01 的模块并把导入模块赋值给了 a a = importlib.import_module("01") stu = a.Student() stu.say()
# 案例 p01.py # 蕴含一个学生类 # 一个 sayHello 函数 # 一个打印语句 class Student(): def __init__(self, name = "NoName", age = 18): self.name = name self.age = age def say(self): print("My name is {0}".format(self.name)) def sayHello(): print("Hi,") # 此判断语句倡议始终作为程序的入口 if __name__ == '__main__': print("我是模块 p01")
# 案例 p02.py import p01 stu = p01.Student("xiaojing", 19) stu.say() p01.sayHello()
My name is xiaojing Hi,
-
import 模块 as 别名
- 导入的同时给模块起一个别名 - 其余用法跟第一种雷同 - 案例 p03.py
# 案例 p03.py import p01 as p stu = p.Student("yueyue", 18) stu.say()
My name is yueyue
-
from module_name import func_name, class_name
- 按上述办法有选择性的导入 - 应用的时候能够间接应用导入的内容,不须要前缀 - 案例 p04
# 案例 p04.py from p01 import Student, sayHello stu = Student() stu.say() sayHello()
My name is NoName Hi,
-
from module_name import *
- 导入模块所有内容 - 案例 p05.py
# 案例 p05.py from p01 import * sayHello() stu = Student("yaona", 20) stu.say()
Hi, My name is yaona
-
-
if __name__ ==
`__main__` 的应用- 能够无效的防止模块代码被导入的时候被动执行的问题
- 倡议所有程序的入口都以此代码为入口
2. 模块的搜寻门路和存储
-
什么是模块的搜寻门路
- 加载模块的时候,零碎会在哪些地方寻找此模块
-
零碎默认的模块搜寻门路
import sys sys.path 属性能够获取门路列表 # 案例 p06.py
# 案例 p06.py import sys print(type(sys.path)) print(sys.path) for p in sys.path: print(p)
<class 'list'> ['D:\\python\\project\\ 包治理', 'D:\\PyCharm Community Edition 2019.1.1\\helpers\\pydev', 'D:\\python\\project', 'D:\\PyCharm Community Edition 2019.1.1\\helpers\\third_party\\thriftpy', 'D:\\PyCharm Community Edition 2019.1.1\\helpers\\pydev', 'C:\\Users\\user\\.PyCharmCE2019.1\\system\\cythonExtensions', 'D:\\python\\project\\ 包治理', 'D:\\Anaconda3\\envs\\opp\\python37.zip', 'D:\\Anaconda3\\envs\\opp\\DLLs', 'D:\\Anaconda3\\envs\\opp\\lib', 'D:\\Anaconda3\\envs\\opp', 'D:\\Anaconda3\\envs\\opp\\lib\\site-packages'] D:\python\project\ 包治理 D:\PyCharm Community Edition 2019.1.1\helpers\pydev D:\python\project D:\PyCharm Community Edition 2019.1.1\helpers\third_party\thriftpy D:\PyCharm Community Edition 2019.1.1\helpers\pydev C:\Users\user\.PyCharmCE2019.1\system\cythonExtensions D:\python\project\ 包治理 D:\Anaconda3\envs\opp\python37.zip D:\Anaconda3\envs\opp\DLLs D:\Anaconda3\envs\opp\lib D:\Anaconda3\envs\opp D:\Anaconda3\envs\opp\lib\site-packages
-
增加搜寻门路
sys.path.append(dir)
-
模块的加载程序
- 搜寻内存中曾经加载好的模块
- 搜寻 python 的内置模块
- 搜寻 sys.path 门路
包
- 包是一种组织治理代码的形式,包外面寄存的是模块
- 用于将模块蕴含在一起的文件夹就是包
- 自定义包的构造
|--- 包
|---|--- __init__.py 包的标记文件
|---|--- 模块 1
|---|--- 模块 2
|---|--- 子包(子文件夹)|---|---|--- __init__.py
|---|---|--- 子包模块 1
|---|---|--- 子包模块 2
-
包的导入操作
-
import package_name
- 间接导入一个包,能够应用__init__.py 中的内容
- 应用形式是:
package_name.func_name
package_name.class_name.func_name() - 此种形式的拜访内容是
- 案例 pkg01, p07.py
# pkg01.__init__py def inInit(): print("I am in init of package") # pkg01.p01.py class Student(): def __init__(self, name = "NoName", age = 18): self.name = name self.age = age def say(self): print("My name is {0}".format(self.name)) def sayHello(): print("Hi,") print("我是模块 p01")
# 案例 p07.py import pkg01 pkg01.inInit()
I am in init of package
-
import package_name as p
- 具体用法跟作用形式,跟上述简略导入统一
- 留神的是此种办法是默认对__init__.py 内容的导入
-
import package.module
- 导入包中某一个具体的模块
-
应用办法
package.module.func_name package.module.class.fun() package.module.class.var
- 案例 p08.py
# 案例 p08.py import pkg01.p01 stu = pkg01.p01.Student() stu.say()
我是模块 p01 My name is NoName
- import package.module as pm
-
-
from … import 导入
- from package import module1, module2, module3, … …
-
此种导入办法不执行
__init__
的内容from pkg01 import p01 p01.sayHello()
-
from package import *
- 导入以后包
__init__.py
文件中所有的函数和类 - 应用办法
func_name()
class_name.func_name()
class_name.var - 案例 p09.py, 留神此种导入的具体内容
- 导入以后包
# 案例 p09.py from pkg01 import * inInit() stu = Student()
I am in init of package NameError: name 'Student' is not defined
-
from package.module import *
- 导入包中指定的模块的所有内容
- 应用办法
func_name()
class_name.func_name()
-
在开发环境中常常会援用其余模块,能够在以后包中间接导入其余模块中的内容
- import 残缺的包或者模块的门路
-
__all__
的用法- 在应用 from package import 的时候, 能够导入的内容
__init__.py
中如果文件为空,或者没有__all__
, 那么只能够把__init__
中的内容导入__init__
如果设置了__all__
的值,那么则依照__all__
指定的子包或者模块进行加载
如此则不会载入
__init__
中的内容__all__=['module1', 'module2', 'package1'... ...]
- 案例 pkg02,p10.py
# pkg02.__init__.py __all__=['p01'] def inInit(): print("T am in init of package") # pkg02.p01.py class Student(): def __init__(self, name = "NoName", age = 18): self.name = name self.age = age def say(self): print("My name is {0}".format(self.name)) def sayHello(): print("Hi,") # 此判断语句倡议始终作为程序的入口 if __name__ == '__main__': print("我是模块 p01")
# 案例 p10.py from pkg02 import * stu = p01.Student() stu.say()
My name is NoName
命名空间
- 用于辨别不同地位不同性能但雷同名称的函数或者变量的一个特定前缀
- 作用是避免命名抵触
setName()
Student.setName()
Dog.setName()
正文完