零基础学 Python(2023 版)
尹会生
太乙人工智能技术合伙人 & 项目总监
60050 人已学习
新⼈⾸单¥68
课程目录
已完结/共 124 讲
结束语 & 结课测试 (2讲)
零基础学 Python(2023 版)
登录|注册
留言
9
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 81|设计模式:怎样合理组合多个函数和类?
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
课程介绍:这次我们都做了哪些升级?
内容综述:明确学习目的
01|如何配置 Python 开发环境?
02 | 常用 IDE:如何提高开发效率?
03 | 如何站在官方文档的肩膀上自己“造轮子”?
04 | 怎样运行你的第一行代码?
05 | 怎样使用 Gitee 管理你的代码?
06 | 学习编程有问题?去这里找答案!
07|跨越门槛:Python 开发环境总结及实现原理
08 | 修炼基本功:浅析输入输出
09 | 变量:如何让计算机临时存储数据?
10|字符串(上):Python 是如何处理单词的?
11|字符串(下):Python 是如何处理单词的?
12|存储数字应该采用哪种数据类型?
13|何时使用数,何时使用字符串?
14|注释:如何写程序的说明书?
15|小试牛刀:如何制作简单计算器?
16|变量命名规范:如何编写优雅的程序?
17|告别新手村:Python 编程基础知识
18|内置数据类型包括哪几种?
19|列表如何处理同类数据?
20|常见常新:列表的常见操作
21|元组:如何处理一次性数据?
22|常见常新:集合的常见操作
23|字典:如何处理映射类型的数据?
24|常见常新:字典的常见操作(上)
25|常见常新:字典的常见操作(下)
26|小试牛刀:如何利用类型转换实现手机通讯录?(上)
27|小试牛刀:如何利用类型转换实现手机通讯录?(下)
28|常见的内置数据类型都何时使用?
29|避坑指南:内置数据类型的常见错误
30|内置数据类型参考:如何使用官方文档与帮助?
31|再回首:“内置数据类型”单元小结
32|if 语句:数据流程出现分支时,怎样编写程序?
33|match 语句:如何通过 match 关键字来处理程序的分支逻辑?
34|while 循环:需要多次重复执行某段程序时,怎么做?
35|for 循环:如何遍历一个对象里的所有元素?
36|语句嵌套:如何处理多重循环的问题?
37|小试牛刀:如何设计一个飞机大战的程序?
38|避坑指南:判断和循环中的常见错误
39|再回首:“判断循环”单元小结
40|输入:如何接收用户通过键盘输入的数据?
41|格式化输出:如何将执行结果通过屏幕输出?
42|F-strings:如何通过定义好的格式进行输出?
43 | 常见常新:文件的打开
44|文件编码:如何解决不同操作系统的文件乱码问题?
45|常见常新:文件的读写
46|常见常新:文件的关闭
47|小试牛刀:如何使用 Python 合并多个文件?
48|再回首:“输入输出与文件操作”单元小结
49|函数的定义:如何优雅地反复引用同一段代码?
50|函数的参数:怎样实现函数与外部数据通信?
51|函数的参数:当函数操作对象不固定时怎么处理?
52|函数的返回值:如何得到函数的执行结果?
53|小试牛刀:如何利用函数实现电商购物车功能?
54|避坑指南:列表作为参数传递出错了怎么办?
55|高阶函数:函数对象与函数调用的用法区别
56|装饰器:函数嵌套的定义与调用的区别
57|再回首:“函数”单元小结
58|编程思想不同会导致怎样的代码差异?
59|类与实例:如何使用面向对象的思想编写程序?
60|类的继承:如何解决代码重用的问题?
61|类的装饰器:如何改变类方法的功能?
62|小试牛刀:如何开发自动咖啡机?
63|避坑指南:类的常见错误
64|init 方法:如何为对象传递参数?
65|再回首:“类”单元小结
66 | 模块的导入:如何使用其他人编写好的代码功能?
67 | 标准库:Python 默认提供的便捷功能有哪些?
68 | 自定义模块:如何编写一个完整功能?
69 | 第三方模块的使用:如何使用其他人编写的代码?
70 | 小试牛刀:如何使用 Python 为函数求导?
71|再回首:“模块与标准库”单元小结
72|初识异常:异常的产生与分类
73|异常捕获:出现异常时,如何利用程序进行处理?
74|自定义异常捕获:如何定义业务异常?
75|避坑指南:编写捕获异常程序时经常出现的问题
76|再回首:“异常处理”单元小结
77|扩展数据类型:怎样使用更复杂的数据类型?
78|魔术方法:怎样通过类构造自己需要的数据类型?
79|怎样将 Python 和 C++ 结合起来混合编程?
80|怎样将已有算法改造成符合项目的特定算法?
81|设计模式:怎样合理组合多个函数和类?
82|Redis 数据库:怎样使用 NoSQL 数据库?
83|关系型数据库:怎样使用关系型数据库?
84|计算资源充足时,如何通过并行设计提高效率?
85|多进程间如何通信?
86|再回首:“高级数据类型与算法”单元小结
87|理论盘点:数据分析的流程及对应的 Python 库
88|理论盘点:数据采集的方法与 HTTP 协议
89|理论盘点:任务的并行执行原理
90|理论盘点:非规范化数据处理的基础与正则表达式
91|如何获取网页上的数据并存储到文件?
92|小试牛刀:如何将数据进行图形化展示?
93|再回首:“数据分析”单元小结
94|理论盘点:文件类型与对应的 Python 函数库
95|如何批量读取 Excel 文件?
96|如何实现数据的批量格式转换?
97|如何扩展数据类型?
98|再回首:“办公自动化”单元小结
99|理论盘点:Web 客户端与服务端
100|理论盘点:MVC 模型是什么?
101|如何使用Django搭建简单的Web服务器?
102|如何使用Django-admin实现文章上传?
103|如何使用Django实现文章发布?
104|再回首:“Web开发”单元小结
105|理论盘点:人脸识别的一般步骤
106|理论盘点:人脸识别常用的 Python 库有哪些?
107|怎样通过 OpenCV 采集视频信号?
108|如何训练人脸模型?
109|怎样设计人脸识别系统?
110|再回首:“计算机视觉”单元小结
111|聚焦异同:物联网与互联网有啥不一样?
112|理论盘点:基础但不简单的 TCP 协议
113|理论盘点:物模型与模组
114|如何为 ESP32 安装 MicroPython?
115|怎样通过 MQTT 协议构建消息队列?
116|小试牛刀:在 OLED 屏幕和手机远程同时显示室内温度
117|再回首:“物联网”单元小结
118|结束语:人生苦短,我用Pyhon
结课测试|来赴一场满分之约吧!
直播加餐|与AI共同编程,用ChatGPT学Python
直播加餐|用OpenAI API理解Python数据类型
直播加餐|掌握Gradio框架:为 AI Agent 程序定制界面
本节摘要

课后习题
为了满足使用自动饮水机泡茶、吃药、冲咖啡等需求,需要为饮水机设计四个按钮,通过按钮,设定饮水机自动出水温度分别为:40 度、60 度、90 度、100 度。请根据此需求设计合理的设计模式。

课程代码、课件及其他相关资料地址
https://gitee.com/wilsonyin/zero-basics-python

登录 后留言

全部留言(9)

  • 最新
  • 精选
Ericpoon
适配器,一直都和代理Proxy模式很像,怎么区分呢?

作者回复: 适配器模式(Adapter Pattern)和代理模式(Proxy Pattern)在表面上看起来确实有些相似,但它们的用途和实现方式有所不同。让我们来详细了解一下这两者的区别。 ### 1. 适配器模式 适配器模式的主要目的是使两个不兼容的接口能够一起工作。适配器充当两个不同对象之间的桥梁,将一个接口转换为另一个接口,使其能与另一个类一起工作。 #### 生活中的例子 想象一下,你从国外带回了一个电器,但是它的插头与你家里的插座不兼容。这时候,你就需要一个插头转换器来连接电器和插座。 #### 代码示例 假设有一个旧的系统使用以下接口: ```python class OldSystem: def old_request(self): return "Old System Request" ``` 新系统的接口如下: ```python class NewSystem: def request(self): return "New System Request" ``` 适配器可以这样实现: ```python class Adapter: def __init__(self, old_system): self.old_system = old_system def request(self): return self.old_system.old_request() ``` 通过适配器,我们可以让新系统使用旧系统的接口。 ### 2. 代理模式 代理模式的目的是为其他对象提供一种代理以控制对这个对象的访问。代理可以用于访问控制、日志记录、懒加载等。 #### 生活中的例子 想象一下你在购买演唱会的门票,但是不想亲自去售票窗口买票。这时候,你可以请朋友(代理)帮你买票。 #### 代码示例 ```python class RealSubject: def request(self): return "Real Subject Request" class Proxy: def __init__(self, real_subject): self.real_subject = real_subject def request(self): # 在访问真实主题之前可以做一些事情 print("Proxy: doing something before the real request...") return self.real_subject.request() ``` ### 区别 - **目的**:适配器是为了让两个不兼容的接口能够协同工作;代理是为了控制对原始对象的访问。 - **实现方式**:适配器通过转换一个接口为另一个接口实现兼容;代理通过提供与原始对象相同的接口,然后在需要的地方调用原始对象。 简而言之,适配器更关注如何连接不同的接口,而代理更关注如何控制对一个对象的访问。

2023-08-08
1
Geek_e328af
是variable,不是variables,强迫症犯了

作者回复: 哈哈哈哈,下次注意~

2023-05-02
yanyu-xin
# 饮水机类 class DrinkMachine: def __init__(self): self.temperature = None def set_temperature(self, temperature): self.temperature = temperature def execute(self, command): command.execute() def undo(self, command): command.undo() # 客户端使用命令进行操作 if __name__ == "__main__": # 创建饮水机和命令对象 machine = DrinkMachine() temp_40_command = Temperature40Command(machine) temp_60_command = Temperature60Command(machine) temp_90_command = Temperature90Command(machine) temp_100_command = Temperature100Command(machine) # 操作饮水机 machine.execute(temp_40_command) print(machine.temperature) machine.undo(temp_40_command) print(machine.temperature) machine.execute(temp_60_command) print(machine.temperature) machine.undo(temp_60_command) print(machine.temperature) machine.execute(temp_90_command) print(machine.temperature) machine.undo(temp_90_command) print(machine.temperature) machine.execute(temp_100_command) print(machine.temperature) machine.undo(temp_100_command) print(machine.temperature) 运行结果如下: 复制代码 40 None 60 None 90 None 100 None 可以看到,通过命令模式,实现了按钮和饮水机出水温度的关联,操作比较灵活。

作者回复: 就目前来说,实现了主要的功能,非常棒。 你可以将程序保留,等接触更多的代码和有更丰富的经验时, 可以考虑将代码继续优化,比如多层级的继承,或继承共同的父类,利用这样的方式减少重复代码的编写。 当然了不能一口吃成胖子,一点一点学,接触更多的代码后,自然就会写复杂的设计模式和架构了

2023-03-21
梅美美🥰
这样对吗老师? class MyDrink: cl_temp = 0 def click_water(self): self.cl_temp = 100 return f'出水温度为:{self.cl_temp}' def click_coffee(self): self.cl_temp = 80 return f'出水温度为:{self.cl_temp}' def click_other(self): self.cl_temp = 60 return f'出水温度为:{self.cl_temp}' c1 = MyDrink() print(c1.click_water()) print(c1.click_coffee()) print(c1.click_other())

作者回复: 对,但不是这一讲关注的问题。 所谓设计模式是指在有依赖、继承关系的基础上,如何编写更容易被人理解以及如何编写尽可能优雅的代码。 比如本例中的 咖啡,其实是 水 + 咖啡液 ,里面再混合上 冰、热、常温等概念后,就需要精心设计一下程序, 让别人易读且代码不累赘。 可以往这方面思考一下

2023-03-02
你好极客时间
class coff_machine(object): def __init__(self): self.degree=0 self.water=0 self.coffe=0 self.ice=0 def click_tea(self): self.degree = 100 self.water = 100 return (f"This is a cup of tea,degree is {self.degree}, water is {self.water}.") def click_coffee(self): self.degree = 90 self.coffee = 20 self.water = 80 return (f"This is a cup of coffee,degree is {self.degree}, water is {self.water},coffee is {self.coffee}.") def click_america(self): self.degree = 0 self.water = 80 self.coffee = 20 self.ice = 20 return (f"This is a cup of ice america,degree is {self.degree}, water is {self.water},coffee is {self.coffee}") a = coff_machine() print(a.click_tea()) print(a.click_coffee()) print(a.click_america())
2024-01-31
Geek_631607
这是一个使用命令模式设计的自动饮水机的 Python 代码示例: ```python class WaterDispenser: def set_temperature(self, temperature): print(f"设置水温为 {temperature} 度") class Command: def __init__(self, dispenser, temperature): self.dispenser = dispenser self.temperature = temperature def execute(self): self.dispenser.set_temperature(self.temperature) class Button: def __init__(self, command): self.command = command def press(self): self.command.execute() dispenser = WaterDispenser() button1 = Button(Command(dispenser, 40)) button2 = Button(Command(dispenser, 60)) button3 = Button(Command(dispenser, 90)) button4 = Button(Command(dispenser, 100)) # 按下按钮,设置水温 button1.press() button2.press() button3.press() button4.press() ``` 在这个代码中,`WaterDispenser` 类代表饮水机,它有一个 `set_temperature` 方法用于设置水温。`Command` 类代表一个命令,它有一个 `execute` 方法用于执行命令。`Button` 类代表一个按钮,它有一个 `press` 方法用于按下按钮。 当你创建一个按钮时,你需要提供一个命令。当你按下按钮时,它会执行这个命令。在这个例子中,我们创建了四个按钮,分别对应四个不同的水温。当你按下一个按钮时,饮水机就会设置到相应的水温。 这个设计满足了开放封闭原则,因为你可以添加更多的按钮和命令,而不需要修改现有的代码。同时,它也满足了单一职责原则,因为每个类都只有一个职责。 .
2023-12-08
Geek_Mike
'''为了满足使用自动饮水机泡茶、吃药、冲咖啡等需求,需要为饮水机设计四个按钮, 通过按钮,设定饮水机自动出水温度分别为:40 度、60 度、90 度、100 度。请根据此需求设计合理的设计模式''' class WaterMachine(): __temperature = None @property def button(self): return self.__class__.__temperature @button.setter def button(self, button_name): self.__class__.__temperature = button_name def show_info(self): water_temp = (40,60,90,100) if self.__class__.__temperature in water_temp: print('出水温度是' + str(self.__class__.__temperature) + '度') else: print('请选择正确的温度') a = WaterMachine() a.button = 70 a.show_info()
2023-08-19
yanyu-xin
刚刚发现一个好的学习方法:我用极客时间的”AI学习助手“,将题目问它,回答如下: (因为超过2000字符,分为两部分留言发出) 这个需求可以采用命令模式设计模式进行实现。设计思路如下: 定义命令接口,包含执行和撤销两个方法。 定义具体命令类,分别对应四个按钮,实现执行和撤销方法。 定义饮水机类,包含设定自动出水温度的方法,并通过命令模式实现按钮与出水温度的关联。 客户端使用按钮命令进行操作。 下面是代码实现: (复制代码) 可以看到,通过命令模式,实现了按钮和饮水机出水温度的关联,操作比较灵活。 from abc import ABC, abstractmethod # 命令接口 class Command(ABC): @abstractmethod def execute(self): pass @abstractmethod def undo(self): pass # 具体命令类 class Temperature40Command(Command): def __init__(self, machine): self.machine = machine self.prev_temp = None def execute(self): self.prev_temp = self.machine.temperature self.machine.set_temperature(40) def undo(self): self.machine.set_temperature(self.prev_temp) class Temperature60Command(Command): def __init__(self, machine): self.machine = machine self.prev_temp = None def execute(self): self.prev_temp = self.machine.temperature self.machine.set_temperature(60) def undo(self): self.machine.set_temperature(self.prev_temp) class Temperature90Command(Command): def __init__(self, machine): self.machine = machine self.prev_temp = None def execute(self): self.prev_temp = self.machine.temperature self.machine.set_temperature(90) def undo(self): self.machine.set_temperature(self.prev_temp) class Temperature100Command(Command): def __init__(self, machine): self.machine = machine self.prev_temp = None def execute(self): self.prev_temp = self.machine.temperature self.machine.set_temperature(100) def undo(self): self.machine.set_temperature(self.prev_temp)
2023-03-21
yanyu-xin
'''一个常温水箱,一个热水箱. 按键:cof;med,warm,hot,on_off 水温由冷热水比例阀控制,流量电子控制,可按off停 先按类别,再按启动.才能出水''' # 控制灯 class Col_lamp_m: _col_lamp = {"cof": 0, "med": 0, "warm": 0, "hot": 0, "on_off": 0} def __init__(self,**args): self.col_lamp |= args @property def col_lamp(self): return self._col_lamp @col_lamp.setter def col_lamp(self, args): self.__class__._col_lamp |= args def display(self): return self.col_lamp # 常温水箱 class Temp_normalbox: _t_normal = 25 def __init__(self, temp): self.get_t_normal = temp @property def get_t_normal(self): return self._t_normal @get_t_normal.setter def get_t_normal(self, temp): self.__class__._t_normal = temp def display_t_normal(self): return self.get_t_normal # 热水箱 class Temp_hotbox: _t_hot = 60 def __init__(self, temp): self.get_t_hot = temp @property def get_t_hot(self): return self._t_hot @get_t_hot.setter def get_t_hot(self, temp): self.__class__._t_hot = temp def display_t_hot(self): return self.get_t_hot # 按键控制逻辑 def col_logic(key_press,**lamp_dict): pass # 加热系统 def heat_water(temp_hot,temp_out): pass # 水温控制 def col_temp(temp_normal,temp_hot,temp_out): pass # 计算冷热水比例,启动冷热水比例阀 # {水类别:[出水温度,水量]} type_water = {"cof":[90,110], "med":[49,150], "warm":[60,300], "hot":[100,300], "out":[50,300]} # 控制灯状态 lamp ={"on_off":0, "cof":0, "med":0, "warm":0, "hot":0 } c_lamp=Col_lamp_m(**lamp) # 控制灯类 t_norm = Temp_normalbox(25) # 温水箱类 t_hot = Temp_hotbox(90) # 热水箱类 while True: pass # 按键 pass # 按键控制逻辑处理,改按键控制灯状态 if # 启动开关 pass # 取得类别的温度,水量参数 pass # 测得冷热水温,计算冷热水比例 pass # 调节水温比例阀 pass # 开流量计、阀门 else: pass # 手动关闭
2023-03-19
收起评论