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.rhkb.cn/news/76045.html

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

相关文章

构造方法 与代理

构造方法 public class Son {String name;/*构造方法1.与类名相同2.没有返回值也没有void*//*作用&#xff1a;实例化初始值使用new关键字必须要有构造器*/public Son(){//无参构造方法this.name"sss";}//有参构造方法public Son(String name){//定义有参构造 就必…

【云存储】使用OSS快速搭建个人网盘教程(阿里云)

使用OSS快速搭建个人网盘 一、基础概要1. 主要的存储类型1.1 块存储1.2 文件存储1.3 对象存储 2. 对象存储OSS2.1 存储空间2.2 地域2.3 对象2.4 读写权限2.5 访问域名&#xff08;Endpoint&#xff09;2.6 访问密钥2.7 常用功能&#xff08;1&#xff09;创建存储空间&#xff…

WebGL Shader着色器GLSL语言

在2D绘图中的坐标系统&#xff0c;默认情况下是与窗口坐标系统相同&#xff0c;它以canvas的左上角为坐标原点&#xff0c;沿X轴向右为正值&#xff0c;沿Y轴向下为正值。其中canvas坐标的单位都是’px’。 WebGL使用的是正交右手坐标系&#xff0c;且每个方向都有可使用的值的…

MFC第二十六天 CRgn类简介与开发、封装CMemoryDC类并应用开发

文章目录 CRgn类简介与开发CRgn类简介CRgn类区域管理开发CRgn类区域管理与不规则形状的选取 封装CMemoryDC类并应用开发CMemoryDC.h封装CMemoryDC开发游戏透明动画CFlashDlg.hCFlashDlg.cpp 封装CMemoryDC开发游戏动画 附录四大窗口CDC派生类 CRgn类简介与开发 CRgn类简介 CR…

c高级:day3

作业: 1. 整理思维导图 2.判断家目录下,普通文件的个数和目录文件的个数 #!/bin/bash ######################################################################## # File Name: zy1.sh # Created Time: 2023年08月04日 星期五 19时13分08秒 ##############################…

计算机网络(2) --- 网络套接字UDP

计算机网络&#xff08;1&#xff09; --- 网络介绍_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/131967378?spm1001.2014.3001.5501 目录 1.端口号 2.TCP与UDP协议 1.TCP协议介绍 1.TCP协议 2.UDP协议 3.理解 2.网络字节序 发送逻辑…

html,css日常记录

动态绑定class&#xff0c;当index3!0时&#xff0c;class的值为bdt :class"{bdt:index3!0}" 动态绑定style中的height和lineheight&#xff0c;其中&#xff0c;height的值为函数px(item.length)的返回值&#xff0c;函数名可以随意取。 :style"{height:px(…

SpringBoot使用@Autowired将实现类注入到List或者Map集合中

前言 最近看到RuoYi-Vue-Plus翻译功能 Translation的翻译模块配置类TranslationConfig&#xff0c;其中有一个注入TranslationInterface翻译接口实现类的写法让我感到很新颖&#xff0c;但这种写法在Spring 3.0版本以后就已经支持注入List和Map&#xff0c;平时都没有注意到这…

基于 Redux + TypeScript 实现强类型检查和对 Json 的数据清理

基于 Redux TypeScript 实现强类型检查和对 Json 的数据清理 突然像是打通了任督二脉一样就用了 generics 搞定了之前一直用 any 实现的类型…… 关于 Redux 的部分&#xff0c;这里不多赘述&#xff0c;基本的实现都在这里&#xff1a;Redux Toolkit 调用 API 的四种方式 和…

机器学习概述及其主要算法

目录 1、什么是机器学习 2、数据集 2.1、结构 3、算法分类 4、算法简介 4.1、K-近邻算法 4.2、贝叶斯分类 4.3、决策树和随机森林 4.4、逻辑回归 4.5、神经网络 4.6、线性回归 4.7、岭回归 4.8、K-means 5、机器学习开发流程 6、学习框架 1、什么是机器学习 机器…

Emacs之set-face-attribute与font-lock-add-keywords用法区别(一百二十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

在java中如何使用openOffice进行格式转换,word,excel,ppt,pdf互相转换

1.首先需要下载并安装openOffice,下载地址为&#xff1a; Apache OpenOffice download | SourceForge.net 2.安装后&#xff0c;可以测试下是否可用&#xff1b; 3.build.gradle中引入依赖&#xff1a; implementation group: com.artofsolving, name: jodconverter, version:…

笔记:Android 9系统启动流程

启动流程 1.按下电源&#xff0c;系统启动 当电源键按下时&#xff0c;引导芯片代码&#xff08;汇编指令&#xff09;会从预定的地方&#xff08;固化在ROM&#xff09;开始执行&#xff0c;将引导程序 BootLoader 加载到 RAM中&#xff0c;然后执行 2.引导程序 BootLoader …

【3维视觉】3D空间常用算法(点到直线距离、面法线、二面角)

3D空间点到直线的距离 3D空间点到直线的距离 3D空间的曲率 三维空间有三个基本元素&#xff0c;点&#xff0c;线&#xff0c;面。那么曲率是如何定义的呢&#xff1f; 点的曲率&#xff1f; 线的曲率&#xff1f; 面的曲率&#xff1f; 法曲率 设曲面上的曲线在某一点处的切…

Unity 使用SharpZipLib解压时报错

报错信息&#xff1a; NotSupportedException: Encoding 936 data could not be found. Make sure you have correct international System.Text.Encoding.GetEncoding (System.Int32 codepage) ICSharpCode.SharpZipLib.Zip.ZipConstants.ConvertToString。 出现问题分析&…

【SpringBoot】日志是+基于lombok的日志输出

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE进阶 在我们日常的程序开发中&#xff0c;日志是程序的重要组成部分&#xff0c;想象⼀下&#xff0c;如果程序报错了&#xff0c;不让你打开控制台看⽇志&#xff0c;那么你能找到报错的原因吗…

leetcode37. 解数独(java)

解数独 解数独题目描述回溯算法代码演示 回溯算法 解数独 难度 困难 leetcode37. 解数独 题目描述 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 1.数字 1-9 在每一行只能出现一次。 2.数字 1-9 在每一列只能出现一次。 3.数字…

【C++】开源:ncurses终端TUI文本界面库

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍ncurses终端文本界面库。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下…

【2023年电赛国一必备】E题报告模板--可直接使用

创作不易&#xff0c;麻烦关注CSDN【技术交流、免费报告资料】 通过百度网盘分享的文件&#xff1a;https://pan.baidu.com/s/1aXzYwLMLx_b59abvplUiYw?pwddn71 提取码:dn71 复制这段内容打开「百度网盘APP 即可获取」 任务 图1 任务内容 要求 图2 基本要求内容 图3 发挥部…

解决word打字卡顿问题的方法

❤ 2023.8.5 ❤ 最近整理论文&#xff0c;本来我是wps死忠粉&#xff0c;奈何wps不支持latex公式。。。 无奈用起了word&#xff0c;但是谁想字数稍微多了一点&#xff0c;word就卡得欲仙欲死&#xff0c;打个字过去2s才显示出来&#xff0c;删除的时候都不知道自己删了几个字…