小甲鱼 发表于 2023-3-6 05:11:16

第083讲:模块和包(上)

0. 本节视频

https://www.bilibili.com/video/BV1c4411e77t?p=84


1. 温馨提示

如果在学习本节课的过程中遇到问题,可以在这个帖子下方提问哦~


啊啊小姐姐 发表于 2023-3-9 23:03:05

模块是一种代码的打包手段,当一些代码在程序中重复出现的时候,就会导致冗杂的局面出现,
函数:这时候就会把它打包成函数的形式,这样只需要调用函数就可以实现代码的重复使用,这是学到的第一种代码打包手段

类和对象:发现可以从另外一个思路来解决代码打包的问题,类和对象来源于现实世界的模拟,
           运用类和对象的打包思维,任何事物都可以被看作是属性和方法的有机结合
           属性决定了对象的静态特征,方法决定了对象的动态能力
           所以面向对象编程也是当前编程思想中的中流砥柱,包括Python自身的构建,它也是面向对象

类不是最高的打包方案,打包是为了重用,类再厉害,也是再一个程序里边重复实例化为多个对象而已
比类还厉害的打包方案是模块,它使得一个或多个源代码文件可以被其他程序所重复使用,
模块是Python中最高级别的组织结构,也是最高层次的代码重用手段,Python最好的特性是可以支持进行高效率的开发

使用Python开发程序的思维习惯就是,程序要做什么事,实现什么功能,第一步要考虑的是实现这些功能,都要用的哪些模块的组合
因为实现各种功能需要的第三方模块PyPi上面都有,比如说老板让你写一个程序,要求是抓取今天的数据并报存到Excel中
编写爬虫要用的哪些模块,读写Excel要用的哪些模块,只需要考虑这两个,然后找到对应模块的开发文档

创建一个叫做hello.py的源文件,它其实就是一个模块,随便写两个函数
def say_hello():
    print('Hello FishC.')

def say_hi():
    print('Hi FishC.')
写完不在这个源文件里面调用它,创建另一个源文件叫做call_hello.py,这这个源文件里面去调用刚刚hello.py这个模块创建的两个函数
第一件事就是将上一个源文件导入
import hello

#做法跟调用random模块是一样的,先是模块名hello.<函数的名字>
hello.say_hi()
hello.say_hello()

#然后运行,程序跑起来了
Hi FishC.
Hello FishC.
# hello.py作为自己定义的模块里面封装的函数,在另一个源文件中被成功调用

Python导入模块的三种方案-------------------------------------------------------------------------------------
import 模块名称
from 模块名称 import 对象名称
import 模块名称 as 关联名称
刚才演示的是第一中方案

第二种方案,修改为from hello去import一个要导入的对象,需要导入两个函数,就输入它的函数名----------------------------------------------------
from hello import say_hi,say_hello

say_hi()
say_hello()
#第二种方案,因为是将整个对象导入,所以可以自己去调用整个对象的名称

Hi FishC.
Hello FishC.
结果是一样的

如果要导入的函数特别多,有一种不推荐的做法就是直接使用星号代替,意思是要导入整个模块所以的对象
from hello import *

say_hi()
say_hello()

结果还是一样的
Hi FishC.
Hello FishC.
采用这种 from模块名import加上对象名称的优势是调用的时候不需要再写模块名,

但一定要注意,命名冲突的问题,比如说要导入模块里边有一个叫做int()的函数
改一下hello模块的名称,这里只是演示
def say_hello():
    print('Hello FishC.')

def say_hi():
    print('Hi FishC.')

def int(x):
    print(f'哈哈{x}')

在call_hello.py源码中添加int
from hello import *

say_hi()
say_hello()
int('250')#这里正常是返回整数250

结果是
Hi FishC.
Hello FishC.
哈哈250#因为名字被覆盖了
#那个内置函数int0被我们自己定义的int0给覆盖了,名字冲突带来的问题往往是比较隐蔽的啊
#还有一种情况就是两个模块之间,拥有相同名字的对象,然后好巧不巧这两个模块我们都使用from import的这个第二种方案的语法去导入,这问题就来了

如,再创建一个文件叫hello_from_the_other_side.py,在里面呢刚好有两个函数叫say_hello,另一个也叫say_hi
def say_hello():
    print('你好呀')

def say_hi():
    print('嗨呀')
保存一下,在call_hello.py这里也把它导入
from hello import *
from hello_from_the_other_side import *

say_hi()
say_hello()
int('250')

#结果是
嗨呀
你好呀
哈哈250
#较迟导入的模块中的方法将覆盖较早导入的模块中的方法,所以使用from import这种导入方案一定要注意名字冲突问题-----------------------------------------

第三种方案是当模块名字毕竟长的时候就非常好用,可以使用 as 关键字给它关联一个新的名称-----------------------------------------------------
比如上面的hello_from_the_other_side函数名,使用第一种方案的话这个模块的名称又实在是又长又难记
那么就可以使用第三种方案
from hello import *
import hello_from_the_other_side as h

#要调用hello_from_the_other_side模块里面的say_hi()方法就h.say_hi(),在这里h就相当于hello_from_the_other_side
h.say_hi()
h.say_hello()
int('250')
#结果是一样的
嗨呀
你好呀
哈哈250

哪怕说把这个给覆盖了
import hello_from_the_other_side as h
from hello import *

h.say_hi()
h.say_hello()
int('250')

#也能够正确的调用到指定模块的对象
嗨呀
你好呀
哈哈250

FiatLux_ 发表于 2023-10-7 21:08:49

本帖最后由 FiatLux_ 于 2023-10-7 21:56 编辑

Python 中导入模块通常有三种方案
import 模块名称
from 模块名称 import 对象名称
import 模块名称 as 关联名称

另:from ...... import*用来导入全局函数方法和变量 ,但易造成对命名污染
                可以通过 __all__ 方法对其进行遏制
页: [1]
查看完整版本: 第083讲:模块和包(上)