Python入门【​编辑、组合、设计模式_工厂模式实现 、设计模式_单例模式实现、工厂和单例模式结合、异常是什么?异常的解决思路 】(十七)

👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白
📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
🍂博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人

🔥🔥🔥 python入门到实战专栏:从入门到实战

🔥🔥🔥 Python爬虫开发专栏:从入门到实战

🔥🔥🔥 Python办公自动化专栏:从入门到实战

🔥🔥🔥 Python数据分析专栏:从入门到实战

🔥🔥🔥 Python前后端开发专栏:从入门到实战  

目录

​编辑

组合

设计模式_工厂模式实现 

设计模式_单例模式实现

工厂和单例模式结合

异常是什么?

异常的解决思路 


组合

结婚就是组合。两人组合后,可以复用对方的属性和方法! 

除了继承,“组合”也能实现代码的复用!“组合”核心是“将父类对象作为子类的属性”。

1、is-a 关系,我们可以使用“继承”。从而实现子类拥有的父类的方法和属性。 is-a 关系指的是类似这样的关系:狗是动物,dog is animal。狗类就应该继承动物类。

2、has-a 关系,我们可以使用“组合”,也能实现一个类拥有另一个类的方法和属性。 has-a 关系指的是这样的关系:手机拥有CPU。 MobilePhone has a CPU

#组合测试
class MobilePhone:def __init__(self,cpu,screen):self.cpu = cpuself.screen = screen
class CPU:def calculate(self):print("计算,算个12345")
class Screen:def show(self):print("显示一个好看的画面,亮瞎你的钛合金大眼")
c = CPU()
s = Screen()
m = MobilePhone(c,s)
m.cpu.calculate()       #通过组合,我们也能调用cpu对象的方法。相当于手机对象间接拥有了“cpu的方法”
m.screen.show()

 运算结果:

计算,算个12345

显示一个好看的画面,亮瞎你的钛合金大眼

设计模式_工厂模式实现 

设计模式是面向对象语言特有的内容,是我们在面临某一类问题时候固定的做法,设计模式有很多种,比较流行的是:GOF(Goup Of Four)23种设计模式。当然,我们没有必要全部学习,学习几 个常用的即可。 对于初学者,我们学习两个最常用的模式:工厂模式和单例模式。 工厂模式实现了创建者和调用者的分离,使用专门的工厂类将选择 实现类、创建对象进行统一的管理和控制。 

 

#工厂模式
class CarFactory:def createCar(self,brand):if brand == "奔驰":return Benz()elif brand == "宝马":return BMW()elif brand ==  '比亚迪':return BYD()else:return "未知品牌,无法创建"
class Benz:pass
class BMW:pass
class BYD:pass
factory = CarFactory()
c1 = factory.createCar("奔驰")
c2 = factory.createCar("宝马")
print(c1)
print(c2)

 运行结果:

<__main__.Benz object at 0x021C5770>
<__main__.BMW object at 0x021C5790>

设计模式_单例模式实现

单例模式(Singleton Pattern)的核心作用是确保一个类只有一个 实例,并且提供一个访问该实例的全局访问点。 单例模式只生成一个实例对象,减少了对系统资源的开销。当一个对象的产生需要比较多的资源,如读取配置文件、产生其他依赖对象时,可以产生一个“单例对象”,然后永久驻留内存中,从而极大 的降低开销。 

⚠️单例模式有多种实现的方式,我们这里推荐重写 __new__() 的方 法。

#单例模式
class MySingleton:__obj = None__init_flag = Truedef __new__(cls, *args, **kwargs):if cls.__obj == None:cls.__obj = object.__new__(cls)return cls.__objdef __init__(self,name):if MySingleton.__init_flag:print("init....")self.name = nameMySingleton.__init_flag = False
a = MySingleton("aa")
print(a)
b = MySingleton("bb")
print(b)

 运算结果:

init....
<__main__.MySingleton object at 0x01E15610>
<__main__.MySingleton object at 0x01E15610>

工厂和单例模式结合

设计模式称之为“模式”,就是一些固定的套路。我们很容易用到其他场景上,比如前面讲的工厂模式,我们需要将工厂类定义成“单例”,只需要简单的套用即可实现: 

#测试工厂模式和单例模式的整合使用
class CarFactory:__obj = None           #类属性__init_flag = Truedef create_car(self,brand):if brand =="奔驰":return Benz()elif brand =="宝马":return BMW()elif brand == "比亚迪":return BYD()else:return "未知品牌,无法创建"def __new__(cls, *args, **kwargs):if cls.__obj ==None:cls.__obj = object.__new__(cls)return cls.__objdef __init__(self):if CarFactory.__init_flag:print("init CarFactory....")CarFactory.__init_flag = False
class Benz:pass
class BMW:pass
class BYD:pass
factory = CarFactory()
c1 = factory.create_car("奔驰")
c2 = factory.create_car("比亚迪")
print(c1)
print(c2)
factory2 = CarFactory()
print(factory)
print(factory2)

运算结果:

init CarFactory....
<__main__.Benz object at 0x01E36E90>
<__main__.BYD object at 0x01E36C30>
<__main__.CarFactory object at 0x01E36730>
<__main__.CarFactory object at 0x01E36730>

1、 如下代码测试对象的浅拷贝、深拷贝,请绘制出内存示意图。

#测试对象的引用赋值、浅拷贝、深拷贝
import copy
class MobilePhone:def __init__(self,cpu,screen):self.cpu = cpuself.screen = screen
class CPU:def calculate(self):print("计算,算个12345")print("CPU对象:",self)
class Screen:def show(self):print("显示一个好看的画面,亮瞎你的钛合金大眼")print("屏幕对象:",self)
c = CPU()
s = Screen()
m = MobilePhone(c,s)
m.cpu.calculate()
n = m               #两个变量,但是指向了同一个对象
print(m,n)
m2 = copy.copy(m)   #m2是新拷贝的另一个手机对象
print(m,m2)
m.cpu.calculate()
m2.cpu.calculate()   #m2和m拥有了一样的cpu对象和screen对象
m3 = copy.deepcopy(m)
m3.cpu.calculate()      #m3和m拥有不一样的cpu对象和screen对象

2、定义发动机类Motor、底盘类Chassis、座椅类Seat,车辆外壳 类Shell,并使用组合关系定义汽车类。其他要求如下:

定义汽车的run()方法,里面需要调用Motor类的work()方法,也需要调用座椅类Seat的work()方法,也需要调用底盘类Chassis的work()方法

3 、使用工厂模式、单例模式实现如下需求:

(1) 电脑工厂类ComputerFactory用于生产电脑Computer。工厂类使用单例模式,也就是说只能有一个工厂对象。

(2) 工厂类中可以生产各种品牌的电脑:联想、华硕、神舟 

(3) 各种品牌的电脑使用继承实现:

(4) 父类是Computer类,定义了calculate方法

(5) 各品牌电脑类需要重写父类的calculate方法

4、 定义一个Employee雇员类,要求如下:

(1) 属性有:id、name、salary

(2) 运算符重载+:实现两个对象相加时,默认返回他们的薪水和

(3) 构造方法要求:输入name、salary,不输入id。id采用自增 的方式,从1000开始自增,第一个新增对象是1001,第二个新 增对象是1002。

(4) 根据salary属性,使用@property设置属性的get和set方法。 set方法要求输入:1000-50000范围的数字。

异常是什么?

软件程序在运行过程中,非常可能遇到刚刚提到的这些问题,我们称之为异常,英文是: Exception ,意思是例外。

遇到这些例外情况, 或者叫异常,我们怎么让写的程序做出合理的处理,安全的退出, 而不至于程序崩溃呢?我们本章就要讲解这些问题。 

工作中,程序遇到的情况不可能完美。比如:程序要打开某个文件,这个文件可能不存在或者文件格式不对;程序在运行着,但是内存或硬盘可能满了等等。

伪代码说明异常机制 

如果我们要拷贝一个文件,在没有异常机制的情况下,我们需要考虑各种异常情况,伪代码如下:

这种方式,有两个坏处:

1 逻辑代码和错误处理代码放一起!

2 程序员本身需要考虑的例外情况较复杂,对程序员本身要求较高!

如上情况,如果是用Python的异常机制来处理,对比如下: 

异常机制本质: 当程序出现异常,程序安全的退出、处理完后继续执行的机制 

python中,引进了很多用来描述和处理异常的类,称为异常类。异 常类定义中包含了该类异常的信息和对异常进行处理的方法。下面较为完整的展示了python中内建异常类的继承层次: 

 

我们处理一下,遇到的第一个异常:

#测试简单的0不能做除数异常

a = 3/0 

Traceback (most recent call last):File "...mypro_exception/my01.py", line 1,
in <module>a = 3/0
ZeroDivisionError: division by zeroProcess finished with exit code 1

 python中一切都是对象,异常也采用对象的方式来处理。处理 过程:

1、抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给解释器。

2、 捕获异常:解释器得到该异常后,寻找相应的代码来处理该异常

异常的解决思路 

解决异常问题的态度

1 、学习完异常相关知识点,只是开始对异常有些认识,不意味着你会调试任何异常;

2、调试异常,需要大量的经验作为基础。因此,大家不要在此停留,继续往后学习。碰到每个异常, 都要花心思去解决而不要动不动张口问人。通过自己的努力无法解决,再去找老师同学帮助解决。

解决每一个遇到的异常,建议大家遵循如下三点:

1、 不慌张,细看信息,定位错误。看清楚报的错误信息,并定位发生错误的地方。

2 、百度并查看十个相关帖子。将异常类信息进行百度,至少查看十个以上的相关帖子。

3 、以上两步仍然无法解决,找老师和同学协助解决。

正常情况,自己遵循如上步骤解决30个以上的错误,就能积累初步的调试经验,以后遇到的大部分错误都能独立完成。

异常解决的关键:定位 

当发生异常时,解释器会报相关的错误信息,并会在控制台打印出 相关错误信息。我们只需按照从上到下的顺序即可追溯 (Trackback)错误发生的过程,最终定位引起错误的那一行代码。

【示例】追溯异常发生的过程

def a():print("run in a() start! ")num = 1/0print("run in a() end! ")
def b():print("run in b() start!")a()print("run in b() end! ")
def c():print("run in c() start!")b()print("run in c() end! ")
print("step1")
c()
print("step2")

控制台打印结果:

step1
run in c() start!
run in b() start!
run in a() start!
Traceback (most recent call last):File "...mypro_exception/my01.py", line 17, in <module>c()File "...mypro_exception/my01.py", line 12, in cb()File "...mypro_exception/my01.py", line 7,in ba()File "...mypro_exception/my01.py", line 3,in anum = 1/0
ZeroDivisionError: division by zero
Process finished with exit code 1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/21775.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

弘扬“两弹一星”精神,勇攀科学技术高峰——道本科技商业大学党日活动圆满落幕

2023年8月2日&#xff0c;道本科技与商业大学携手举办了一场主题为“弘扬‘两弹一星’精神&#xff0c;勇攀科学技术高峰”的党日活动。本次活动旨在了解党领导下的中国核工业发展历程&#xff0c;传承和弘扬“两弹一星”精神&#xff0c;同时展示道本科技创新产品&#xff0c;…

ThinkPHP5使用phpqrcode生成二维码

生成指定跳转地址二维码图片&#xff1a; 首先将下载好的phpqrcode.php文件放到指定目录内&#xff08;我这里用的放在public/phpqrcode目录下&#xff09;&#xff0c;准备调用 之后控制器中调用 public function qrcode(){require_once "./phpqrcode/phpqrcode.php&quo…

opencv-33 图像平滑处理-中值滤波cv2.medianBlur()

中值滤波是一种常见的图像处理滤波技术&#xff0c;用于去除图像中的噪声。它的原理是用一个滑动窗口&#xff08;也称为卷积核&#xff09;在图像上移动&#xff0c;对窗口中的像素值进行排序&#xff0c;然后用窗口中像素值的中值来替换中心像素的值。这样&#xff0c;中值滤…

SHELL——备份脚本

编写脚本&#xff0c;使用mysqldump实现分库分表备份。 1、获取分库备份的库名列表 [rootweb01 scripts]# mysql -uroot -p123456 -e "show databases;" | egrep -v "Database|information_schema|mysql|performance_schema|sys" mysql: [Warning] Using …

游戏开发人员如何从 Splashtop 中受益

游戏开发时代在不断发展&#xff0c;远程办公、协作和高性能需求变得越来越普遍。因此&#xff0c;对复杂工具的需求不断增加&#xff0c;这些工具不仅可以满足这些需求&#xff0c;还可以为开发人员提供无缝体验。 其中一个工具是 Splashtop Business Access Performance&…

Redis持久化两种方案以及对比差异

1.1.RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff09;&#xff0c;也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后&#xff0c;从磁盘读取快照文件&#xff0c;恢复数据。快照文件称为R…

2023网络安全学习路线 非常详细 推荐学习

首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题 1、打基础时间太长 学基础花费很长时间&#xff0c;光语言都有几门&#xff0c;有些人会倒在学习 linux 系统及命令的路上&#xff0c;更多的人会倒在学习语言上&#xff1b; 2、知识点掌握程度不清楚 对于网络安…

微信多开(双开三开均可,且不局限于微信,其他设备亦可)

1.鼠标右键“微信”&#xff0c;属性 如上图&#xff0c;自动选取的&#xff0c;别动&#xff0c;然后CtrlC,,,,结果如下 "C:\Program Files (x86)\Tencent\WeChat\WeChat.exe" 2.创建文本&#xff0c;电脑桌面空白处单击&#xff0c;新建&#xff0c;文本档案&#…

小白玩转浏览器开发者工具—F12(超详细)

目录 1、检查元素&#xff1a;&#x1f680; 2、修改样式&#xff1a;&#x1f6eb; 3、调试代码&#xff1a;&#x1f451; 4、网络分析&#xff1a;&#x1f682; 5、控制台输出&#xff1a;&#x1f681; 6、移动设备模拟&#xff1a;&#x1f3a8; 7、缓存管理&…

“单片机定时器:灵活计时与创新功能的关键“

学会定时器的使用对单片机来说非常重要&#xff0c;因为它可以帮助实现各种时序电路。时序电路在工业和家用电器的控制中有广泛的应用。 举个例子&#xff0c;我们可以利用单片机实现一个具有按钮控制的楼道灯开关。当按钮按下一次后&#xff0c;灯会亮起并持续3分钟&#xff…

FFmpeg常见命令行(一):FFmpeg工具使用基础

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个&#xff0c; 对应的要学习的内容是&#xff1a;FFmpe…

无涯教程-Lua - 条件判断

if结构要求程序员确定一个或多个要由程序判断或测试的条件&#xff0c;以及要确定的条件为真的情况下要执行的一条或多条语句&#xff0c;如果条件为真&#xff0c;则执行指定语句&#xff0c;如果条件为假&#xff0c;则执行其他语句。 Lua编程语言假定布尔值 true 和 non-nil…

华为、阿里巴巴、字节跳动 100+ Python 面试问题总结(六)

系列文章目录 个人简介&#xff1a;机电专业在读研究生&#xff0c;CSDN内容合伙人&#xff0c;博主个人首页 Python面试专栏&#xff1a;《Python面试》此专栏面向准备面试的2024届毕业生。欢迎阅读&#xff0c;一起进步&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; …

【2023】Git版本控制-远程仓库详解

目录 创建远程仓库向远程仓库推送数据文件从第二台主机本地拉取远程仓库数据第一台主机同步远程仓库数据tag标签git忽略文件 Git远程仓库是Git版本控制系统的一个概念&#xff0c;它是一个存储Git代码的远程服务器。 你可以将本地Git仓库上传到远程仓库&#xff0c;以便与其他…

【机器学习】Classification using Logistic Regression

Classification using Logistic Regression 1. 分类问题2. 线性回归方法3. 逻辑函数&#xff08;sigmod&#xff09;4.逻辑回归5. 决策边界5.1 数据集5.2 数据绘图5.3 逻辑回归与决策边界的刷新5.4 绘制决策边界 附录 导入所需的库 import numpy as np %matplotlib widget imp…

“RISC-V成长日记” blog发布,第一个运行在RISC-V服务器上的blog?

尽管推特、公众号、微博、抖音等社交平台风靡一时&#xff0c;但blog&#xff08;博客&#xff09;在全世界依然经久不衰&#xff0c;尤其是在技术领域。对于博主而言&#xff0c;博客是他们独立创作的天地&#xff0c;可以随时更新内容和故事&#xff0c;确保素材的时效性。此…

IDEA项目实践——创建Java项目以及创建Maven项目案例、使用数据库连接池创建项目简介

系列文章目录 IDEA上面书写wordcount的Scala文件具体操作 IDEA创建项目的操作步骤以及在虚拟机里面创建Scala的项目简单介绍 目录 系列文章目录 前言 一 准备工作 1.1 安装Maven 1.1.1 Maven安装配置步骤 1.1.2 解压相关的软件包 1.1.3 Maven 配置环境变量 1.1.4 配…

[Docker实现测试部署CI/CD----相关服务器的安装配置(1)]

目录 0、CI/CD系统最终架构图规划IP地址 1、git配置Git下载pycharm配置gitidea配置git 2、GitLab安装与配置主机要求拉取镜像定义 compose.yml启动gitlab浏览器访问并修改密码查看登录密码修改密码 3、SonarQube 安装与配置拉取镜像修改虚拟内存的大小启动SonarQube登录 SonarQ…

mac pd安装ubuntu并配置远程连接

背景 一个安静的下午&#xff0c;我又想去折腾点什么了。准备学习一下k8s的&#xff0c;但是没有服务器。把我给折腾的&#xff0c;在抱怨了&#xff1a;为什么M系列芯片的资源怎么这么少。 好在伙伴说&#xff0c;你可以尝试一下ubantu。于是&#xff0c;我只好在我的mac上安…

软件外包开发的GO语言特点

Go语言&#xff08;也称为Golang&#xff09;是由Google开发的一种编程语言。它具有许多特点&#xff0c;使其成为许多项目范围的优秀选择。Go语言适用于需要高性能、并发和简洁易读的项目&#xff0c;特别是面向网络和分布式应用的项目。今天和大家分享项目的特点及适用的项目…