版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33248299/article/details/82832281
一.模块
1.模块
- 模块是python程序架构的一个核心概念
- 每一个以扩展名py结尾的Python源代码文件都是一个模块
- 模块名同样也是一个标识符
- 模块就好比是工具包,要想使用这个工具包中的工具,就需要先导入这个模块
2.模块两种导入方法
- import导入
import 模块名1,模块名2(不推荐)
- 在导入模块时,每个导入应该独占一行
- 通过
模块名.
使用模块提供的工具 --全局变量,函数,类
import 模块名1
import 模块名2(推荐使用)
- 如果模块名字太长,可以使用as指定模块的名称,以方便在代码中使用
import 模块名1 as 模块别名
#全局变量
title = "模块1"
def say_hello():
print("我是 %s" %(title))
class Cat(object):
pass
# 全局变量
title = "模块2"
def say_hello():
print("我是 %s" % (title))
class Dog(object):
pass
import stefan_01_测试模块1 as CatModle
import stefan_02_测试模块2 as DogModle
print(CatModle.title)
CatModle.say_hello()
print(CatModle.Cat)
print(DogModle.title)
DogModle.say_hello()
print(DogModle.Dog)
/*
模块1
我是 模块1
<class 'stefan_01_测试模块1.Cat'>
模块2
我是 模块2
<class 'stefan_02_测试模块2.Dog'>
*/
- from…import导入
- 导入之后不需要通过
模块名.
可以直接使用模块提供的工具–全局变量,函数,类
# 从 模块 导入 某一个工具
from 模块名1 import 工具名
from stefan_01_测试模块1 import Cat
from stefan_02_测试模块2 import say_hello
say_hello()
xiaohuang = Cat()
print(xiaohuang)
- 如果两个模块,存在同名函数,那么后导入模块函数会覆盖掉先导入的函数
from stefan_01_测试模块1 import say_hello
from stefan_02_测试模块2 import say_hello
say_hello()
/*
我是模块2
*/
- 一旦发现冲突,可以使用as关键字给其中一个工具起一个别名
from stefan_01_测试模块1 import say_hello as Model1_say_hello
from stefan_02_测试模块2 import say_hello
say_hello()
Model1_say_hello()
/*
我是 模块2
我是 模块1
*/
- from…import导入所以工具
from 模块名1 import *(不推荐使用,函数重名并没有任何提示,出现问题不好排查)
from stefan_01_测试模块1 import *
from stefan_02_测试模块2 import *
print(title)
say_hello()
xiaohuang = Cat()
print(xiaohuang)
/*
模块2
我是 模块2
<stefan_01_测试模块1.Cat object at 0x000000A3CD49F0F0>
*/
3.模块搜索顺序
- 搜索当前目录指定模块名的文件,如果有就直接导入
- 如果没有,再搜索系统目录
- 在开发时,给文件起名,不要和系统的模块文件重名
4.__name__属性
__name__属性
可以做到,测试模块的代码只在测试情况下被运行,而在被导入时不会被执行__name__属性
是Python的一个内置属性,记录这一个字符串- 如果是被其他文件导入的,
__name__属性
就是模块名 - 如果是当前执行的程序
__name__属性
是__main__
/*只有直接执行这个程序,才会打印*/
def say_hello():
print("你好你好,我是say")
if __name__ =="__main__":
print(__name__)
print("小明开发的模块")
say_hello()
二.包
1.包
- 包是一个包含多个模块的特殊目录
- 目录下有一个特殊文件
__init__
.py - 包名的命名方式和变量名一致,小写字母+
_
- 使用import 包名可以一次性导入包中所有模块,但是要先在
__init__
.py设置
__init__
.py
from . import send_message
from . import receive_message
receive_message.py
def receive():
return "这是来自 stefan 的短信"
send_message.py
def send(text):
print("正在发送 %s" %text)
import stefan_message
stefan_message.send_message.send("hello")
print(stefan_message.receive_message.receive())
/*
正在发送 hello
这是来自 stefan 的短信
*/