一、模块和包#

1. 模块#

Python中模块就是一个.py文件 模块中可以定义函数,变量,类 模块可以被其他模块引用

创建utils.py文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 定义变量 
name = '张三'

# 定义函数
def sum(a,b):
    return a+b

# 定义类
class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __str__(self):
        return 'name:{},age:{}'.format(self.name,self.age)

导入模块utils中的功能

整体导入模块

1
2
3
4
5
6
7
8
9
# 导入模块
import utils

# 使用模块中功能
print(utils.name)
# 调用模块中的sum方法
result = utils.sum(10,20)
# 创建模块utils中的Person类对象
p = utils.Person('张三',30)

局部导入模块中功能

1
2
3
4
5
6
7
# 从模块中导入部分功能
from utils import name,sum

# 使用name
print(name)
# 调用sum函数
result = sum(10,20)

到不引入模块中所有功能

1
2
3
4
5
6
7
8
from utils import *

# 使用name
print(name)
# 调用sum函数
result = sum(10,20)
# 创建Person对象
p = Person('林青霞',60)

2. 模块的引入冲突#

如果两个模块中有同名的变量、函数或者类,同时引入就可能出现冲突

局部引入冲突

1
2
3
4
from hello import name
from hi import name

print(name)

同时引入name的话,输出的name是hi中的name,是有顺序的

局部引入冲突解决方案

可以通过as 给功能起别名

1
2
3
4
5
from hello import name as hello_name
from hi import name as hi_name

print(hello_name)
print(hi_name)

全部引入冲突

1
2
3
4
from hello import *
from hi import *

print(name)

同样输出的是hi中的name属性

全部引入冲突解决方案

直接引入模块

1
2
3
4
5
import hello
import hi

print(hello.name)
print(hi.name)

3. 模块的内置变量__name__#

__name__是模块中内置的变量,每个模块都有这个属性

创建hello.py

1
print(__name__)

__name__的值

直接运行hello.py,结果为:

1
__main__

其它模块导入hello.py

1
import hello

结果为:

1
hello

__name__的特点

  • 如果将当前模块作为启动项,name__值为”__main
  • 如果当前模块当作依赖引入,name__值不为”__main

__name__作用

python没有入口函数的概念,可以通过__name__的功能

1
2
3
4
5
6
7
8
def sum(m,n):
    return m+n

if __name__ == '__main__':
    a = 10
    b =20
    result = sum(a,b)
    print(result)

主程序的代码放在if __name__ == '__main__':

4. 包#

包就是个文件夹 用来放模块的 限定了模块的命名空间

包的作用

用来管理模块的 让业务更清晰化 解决一些命名的问题

1
2
3
4
5
6
7
8
9
network包:可以用来管理网络访问
    user模块中,可以提供登录,注册等功能
    cart模块中,可以提供购物车的增删改查功能
    product中,可以提供商品的查看功能

storage包:可以用来管理本地存储
    user模块中,可以提供用户信息存储功能
    cart模块中,可以提供购物车存储功能
    product中,可以提供商品存储功能

通过包把类似功能的模块进行分类,让业务更加清晰

引入包中模块的功能方法一

import 包名.模块名

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import pkg.hello

#访问模块中的属性
print(pkg.hello.name)

#访问模块中的函数
pkg.hello.say()

#访问模块中的类
nice = pkg.hello.Nice()

引入包中模块的功能方法二

from 包名 import 模块名

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
from pkg import hello

#访问模块中的属性
print(hello.name)

#访问模块中的函数
hello.say()

#访问模块中的类
nice = hello.Nice()

引入包中模块的功能方法三

from 包名.模块名 import 属性,函数,类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from pkg.hello import name
from pkg.hello import say
from pkg.hello import Nice

#访问模块中的属性
print(name)

#访问模块中的函数
say()

#访问模块中的类
nice = Nice()

引入包中模块的功能方法三

from 包名.模块名 import *

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
from pkg.hello import *

#访问模块中的属性
print(name)

#访问模块中的函数
say()

#访问模块中的类
nice = Nice()