欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[python面向对象学习笔记八] 模块和包

程序员文章站 2022-03-05 13:12:51
...

一、模块

1.概念

每一个以扩展名.py结尾的源代码文件都是一个模块。

模块名同样也是一个标识符,需要符合标识符的命名规则:由数字、字母和下划线组成,而且开头不能是数字。

模块就好比是工具包,模块中定义的全局变量、函数、类,都是提供外界使用的工具。

要想使用模块中的工具,首先要导入这个模块。

2.导入模块

有两种方式:import导入、from…import导入

(1)import 导入。会一次性把模块中的所有工具全部导入;导入之后,通过 模块名. 使用模块中的工具----全局变量、类、函数。

注意:每个导入应该独占一行。

import 模块名1
import 模块名2

例子:xb_01,xb_02 均为编写好的.py程序

xb_01.py:

# 全局变量
title = "模块1"

# 函数
def say_hello():
    print("我是 %s" % title)

# 类
class Dog(object):
    pass

xb_02.py:

# 全局变量
title = "模块2"

# 函数
def say_hello():
    print("我是 %s" % title)

# 类
class Cat(object):
    pass

在主程序中调用这两个模块:

import xb_01
import xb_02

xb_01.say_hello()
xb_02.say_hello()

dog = xb_01.Dog()
print(dog)
cat = xb_02.Cat()
print(cat)

输出:
我是 模块1
我是 模块2
<xb_01.Dog object at 0x0000013DC443ADC8>
<xb_02.Cat object at 0x0000013DC564C7C8>

注意:如果模块的名字太长,可以使用 as 指定模块的别名。模块的别名应该符合大驼峰命名法(每个单词的首字母大写,单词之间没有下划线)。

import 模块名1 as 模块别名

例子:

import xb_01 as DogMoudle
import xb_02 as CatMoudle

DogMoudle.say_hello()
CatMoudle.say_hello()

(2)from…import 导入。从一个模块中,导入部分工具。导入后,不需要通过模块名. ,可以 直接使用模块中的工具–全局变量、函数、类。

from 模块名1 import 工具名

例子:

from xb_01 import Dog
from xb_02 import say_hello

dog = Dog()
print(dog)
say_hello()

注意:
如果两个模块,存在同名函数,那么后导入模块的函数,会覆盖掉先导入的函数。一旦发生冲突,可以使用 as 给其中一个工具起别名。

from xb_01 import say_hello
from xb_02 import say_hello as Module2_say_hello

say_hello()
Module2_say_hello()

从模块导入所有工具:工具不需要使用模块名. 的格式,可以直接使用工具名。(不推荐,对函数重名没有任何提示)

from 模块名1 from *

3.模块的搜索顺序

解释器在导入模块时,会首先搜索当前目录,没有找到再去搜索系统目录。所以,给文件起名时,不要和系统的模块文件重名。

4.开发原则-------每一个文件都应该是可以被导入的

问题:在导入文件时,文件中的所有没有缩进的代码都会被执行一遍!但是,开发人员通常会在模块的下方增加一些测试代码希望仅在模块内使用,而被导入到其他模块中不需要执行。

解决:采用__name__判断,把测试代码放到判断句的下面。这样,测试代码只有在运行该程序时会被运行,在导入到其他程序中的时候,测试代码并不会被执行。

原理:__name__是一个内置属性,记录着一个字符串。如果是当前执行的程序,__name__就是__main__的;如果是被其他文件导入的,__name__就是模块名。

例子:
在模块中,

def say_hello():
    print("我是 hello")

if __name__ == "__main__":
    say_hello()

因此,为保证代码的可读性,方便被导入到其他文件,正确的程序格式应该如下所示:

# 导入模块
# 定义全局变量
# 定义类
# 定义函数

# 在代码的最下方
def main():
	pass

# 根据 __name__判断是否执行下方代码
if __name == "__main__":
	main()

二、包

是一个包含多个模块的目录。
目录下有一个特殊的文件 __ init__.py
包名的命名方式和变量名一致,包含小写字母、数字、下划线(不以数字开头) 。

好处:使用 import 包名 可以一次性导入包中所有的模块。

例子:

(1)创建一个包xb_message:

方式一:新建目录(Directory),在该目录中手动新建一个空白的__init__的py文件。
方式二:直接新建 Python Package。会自动生成一个空白的__init__文件。

(2)新建两个文件,send_message和receive_message文件。在第一个文件定义send函数,第二个文件定义receive函数。

def send(text):
    print("正在发送%s..." % text)
def receive():
    return "这是来自10086的短信"

(3)配置__init__文件:指定对外界提供的模块列表

from . import send_message
from . import  receive_message

(4)在外界调用包。

import xb_message     # 导入包
xb_message.send_message.send("三号高地,收到请回答!") # 包名.模块名.函数名
txt = xb_message.receive_message.receive()
print(txt)