0%

python进阶学习二

一、pyhton项目组织架构—包和模块和类

python组织架构:包–>模块–>类。而类中有函数和变量。一个包可以包含很多模块,一个模块可以包括很多类。和java、c++不同,python中一个文件经常有多个类。java和c++中一般一个文件只有一个类,包可以理解就是一个文件夹(java中是jar包的概念)。

1,包和模块的命名

表面上看,包的名字就是文件夹的名字,模块的名字就是文件的名字,如果想让一个普通文件夹成为一个包,就在文件夹中加入init.py文件,当然我们也可以在这个文件中写代码。不过它比较特殊,init.py这个模块的名字就是包名,比如如下包中init.py模块的名字就是python:

1.1,模块的导入

在一个模块中导入另一个模块,用 import module_name来导入,使用的时候通过 模块名.变量名来使用,否则会找不到这个变量。如下图所示,我们虽然导入了test6这个模块,但是使用test6模块的变量c在输出语句还是报错了,我们改为test6.c则可以,这就说明要通过模块名.变量名来使用其他模块的变量。并输出c的值为3,我们在test6模块中定义了变量c,它的值为3。我们也可以引入模块中的函数。


注意:python是解释型语言,引入模块的时候import语句应该在第一行,如果我们把import语句放在需要调用被引入模块的变量或函数时,python解释器会报错,,如下图所示:

如果是子包就需要加上命名空间。import只能导入模块,不能用模块.变量名来导入变量。不过可以import test6 as m(这就是把命名空间简化成一个字符),引用变量的时候就可以这样:

1
2
3
4
import test6 as f
print(f.c)
PS G:\python> python .\test7.py
3

可以看到编译器没有报错,而且同样可以运行成功。

1.1.2 模块(module)另一种导入方式

语法:

1
2
from py.test import c
print(c)

我们是直接导入了test6的变量c,所以可以直接使用变量c。
同样,我们也可以用这种方式导入模块,如下:

1
2
from py import test
print(test.c)

其中py
是python包下的子包,它和模块test7.py是属于同一级。如果一个模块有很多变量需要被其他的模块使用那应该怎么导入呢?

1
2
3
4
5
6
7
8
9
10
11
from py.test import *
print(a)
print(b)
print(c)
print(g)
#输出
PS G:\python> python .\test7.py
1
2
3
7

可以看到,我们可以用 ‘*’来导入py.test中所有的变量和函数。不过会提示语法错误,但是可以执行。实际开发中并不是所有的变量和函数我们都需要,所以我们还可以控制 * 的导入行为,导入什么不导入什么,在需要被导入的模块中添加如下代码,就说明只导入变量a和b:

1
__all__ = ['a','b']

python建议一般一行不要超过80个字符。

1
2
3
4
5
6
from test5 import a,b,\
c
# \ 可以换行
from test5 import (a,b,
c)
#括号也可以换行(建议使用)。

init.py是什么?有什么作用?
init.py可以帮我们做初始化,我们可以把需要导入的库在这里导入,然后在其他的模块中导入包(要确定该包中有init.py这个文件)。

2,包的导入知识点

1,包的导入不会重复
2,注意循环导入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#test7.py
from test8 import t8

t7 = 2
#test8.py
from test7 import t7

t8 = 3

print(t7)
#运行结果
PS G:\python> python test8.py
Traceback (most recent call last):
File "test8.py", line 4, in <module>
from test7 import t7
File "G:\python\test7.py", line 34, in <module>
from test8 import t8
File "G:\python\test8.py", line 4, in <module>
from test7 import t7
ImportError: cannot import name 't7'

这就是循环导入,代码会出问题。