鱼C论坛

 找回密码
 立即注册
查看: 1835|回复: 2

[知识点备忘] 第083讲:模块和包(上)

[复制链接]
发表于 2023-3-6 05:11:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
0. 本节视频




1. 温馨提示

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


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 6 反对 0

使用道具 举报

发表于 2023-10-7 21:08:49 | 显示全部楼层
本帖最后由 FiatLux_ 于 2023-10-7 21:56 编辑

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

另:from ...... import*  用来导入全局函数方法和变量 ,但易造成对命名污染
                可以通过 __all__ 方法对其进行遏制
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 02:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表