为什么我们用模块
如何定义模块
不过根据模块的规范,最好在本块中编写以下内容
- 函数(单一功能) - 类(相似功能的组合,或者类似业务模块) - 测试代码
如何使用模块
模块直接导入
- 模块名称直接以数字开头,需要借助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__` 的使用
什么是模块的搜索路径
系统默认的模块搜索路径
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)
模块的加载顺序
|---包 |---|--- __init__.py 包的标志文件 |---|--- 模块1 |---|--- 模块2 |---|--- 子包(子文件夹) |---|---|--- __init__.py |---|---|--- 子包模块1 |---|---|--- 子包模块2
包的导入操作
import package_name
package_name.func_name
package_name.class_name.func_name()
# 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
import package.module
使用方法
package.module.func_name package.module.class.fun() package.module.class.var
# 案例 p08.py import pkg01.p01
stu = pkg01.p01.Student()
stu.say()
我是模块p01
My name is NoName
from ... import 导入
此种导入方法不执行 __init__
的内容
from pkg01 import p01
p01.sayHello()
from package import *
__init__.py
文件中所有的函数和类
func_name()
class_name.func_name()
class_name.var
# 案例 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()
在开发环境中经常会引用其他模块,可以在当前包中直接导入其他模块中的内容
__all__
的用法
__init__.py
中如果文件为空,或者没有 __all__
, 那么只可以把 __init__
中的内容导入
__init__
如果设置了 __all__
的值,那么则按照 __all__
指定的子包或者模块进行加载
如此则不会载入 __init__
中的内容
__all__=['module1', 'module2', 'package1'... ...]
# 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()