当前位置: 首页 > news >正文

【python设计模式1】面向对象设计原则

目录

设计模式分类

面向对象

接口

面向对象设计原则

里氏替换原则

依赖倒置原则

接口隔离原则

单一职责原则


设计模式是对软件设计中普遍存在或反复出向的各种问题所提出的解决方案。每一个设计模式系统地被命名、解释和评价了面向对象系统中一个重要和重复出现的设计。

设计模式分类

创建型模式:工厂方法模式、抽象工厂模式、创建者模式、原型模式、单例模式。隐藏底层模块的逻辑,关注怎么创建对象

结构型模式:适配器模式、桥模式、组合模式、装饰模式、外观模式、享元模式、代理模式。类之间如何协同工作,应该组成什么结构

行为型模式:解释器模式、责任链模式、命令模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、访问者模式、模板方法模式。关注行为,也就是方法,应该怎样某些行为

面向对象

设计模式解决的就是面向对象中的问题。需要指导面向对象的三大特性是 封装、继承和多态 ,封装是把数据和方法封装到类中,继承是类之间复用代码,多态在Python中默认支持的,Python是一种多态的语言。

接口

接口是若干抽象方法的集合。接口的作用是限制实现接口的类必须按照接口给定的调用方式实现这些方法,对高层模块隐藏了类的内部实现。下面通过一个简单的例子来加强对接口的理解:

from abc import ABCMeta, abstractmethod# 具有抽象方法的类就是接口类,
class Payment(metaclass=ABCMeta):@abstractmethoddef pay(self, money):"""抽象方法,在实现的类中必须实现的方法。限制实现接口的类必须按照接口给定的调用方式实现这些方法:param money: :return: """pass# 不能说是继承接口类,应该说是实现接口
class Alipay(Payment):def pay(self, money):"""实现接口类中的必须实现的方法:param money::return:"""print("支付宝支付了{0}元!".format(money))class WechatPay(Payment):def pay(self, money):"""实现接口类中的必须实现的方法:param money::return:"""print("微信支付了%d元!" % (money))# 下面是高层代码,在调用的时候是看不到底层类的内部实现
a = Alipay()
w = WechatPay()
a.pay(100)
w.pay(100)

面向对象设计原则

一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。即软件实体应该在不修改原代码的情况下进行修改。

里氏替换原则

所有引用父类的地方必须能透明地使用其子类地方必须能透明地使用其子类的对象,一个简单的例子加强理解

class User(object):def print_name(self):passclass VipUser(User):def print_name(self):"""保证参数和返回值类型需要和父类一样:return:"""pass
def print_name(u):"""不论使用User还是继承User的VipUser,调用的方式是一样的。这就要求User和VipUser的方法参数和返回值类型是一样的:param u::return:"""u.print_name()

依赖倒置原则

高层模块不应该依赖底层模块,二者都应该依赖抽象。抽象不应该依赖细节,细节应该应该依赖抽象。要针对接口编程,而不是针对实现编程。通过例子加强理解:

from abc import ABCMeta, abstractmethod# 接口,抽象不应该依赖细节
class Payment(metaclass=ABCMeta):@abstractmethoddef pay(self, money):pass# 底层代码和高层代码都是细节,细节应该依赖抽象
# 底层代码
class Alipay(Payment):def pay(self, money):print("支付宝支付了{0}元!".format(money))class WechatPay(Payment):def pay(self, money):print("微信支付了%d元!" % (money))# 高层代码,高层模块不应该依赖底层模块,二者都应该依赖抽象
a = Alipay()
w = WechatPay()
a.pay(100)
w.pay(100)

接口隔离原则

使用多个专门的接口,而不使用单一的总结口,高层的代码不应该依赖那些它不需要的接口。通过例子加强理解:

from abc import ABCMeta, abstractmethodclass LandAnimal(metaclass=ABCMeta):@abstractmethoddef walk(self):passclass WaterAnimal(metaclass=ABCMeta):@abstractmethoddef swim(self):passclass SkyAnimal(metaclass=ABCMeta):@abstractmethoddef fly(self):pass# 高层的代码不应该依赖那些它不需要的接口
class Tiger(LandAnimal):def walk(self):pass# 高层的代码不应该依赖那些它不需要的接口
class Frog(LandAnimal, WaterAnimal):def walk(self):pass

单一职责原则

不要存在多于一个导致类变更的原因,一个类只负责一项职责,一个类只做一件事。把面向过程的代码放到类中,虽然用到了类,但不是面向对象

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于springboot+vue+uniapp的驾校报名小程序
  • 工厂模式,策略模式,代理模式,单例模式在项目中的应用
  • 大语言模型之ICL(上下文学习) - In-Context Learning Creates Task Vectors
  • 淘宝npm镜像源更新后,如何正常使用npm命令
  • linux下lvm(逻辑卷管理器)
  • WebGL系列教程五(使用索引绘制彩色立方体)
  • 云平台虚机卡顿问题分析
  • 恐怖类游戏智能体————孤岛惊魂
  • 禁忌搜索算法(TS算法)求解实例---旅行商问题 (TSP)
  • 图神经网络模型扩展5--3
  • java编程行业特点
  • OpenAI API key not working in my React App
  • 无人机 PX4 飞控 | EKF2简介与使用方法
  • pyinstaller打包python程序
  • 【LeetCode 算法笔记】155. 最小栈
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Iterator 和 for...of 循环
  • JavaScript函数式编程(一)
  • learning koa2.x
  • Octave 入门
  • Ruby 2.x 源代码分析:扩展 概述
  • SOFAMosn配置模型
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 简单基于spring的redis配置(单机和集群模式)
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 如何解决微信端直接跳WAP端
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 事件委托的小应用
  • 算法---两个栈实现一个队列
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 小程序开发中的那些坑
  • 学习JavaScript数据结构与算法 — 树
  • Hibernate主键生成策略及选择
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • #70结构体案例1(导师,学生,成绩)
  • #git 撤消对文件的更改
  • #HarmonyOS:基础语法
  • #NOIP 2014# day.1 T2 联合权值
  • #NOIP 2014# day.2 T2 寻找道路
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (~_~)
  • (06)金属布线——为半导体注入生命的连接
  • (1)(1.9) MSP (version 4.2)
  • (2)nginx 安装、启停
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (6)设计一个TimeMap
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (九)信息融合方式简介
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (小白学Java)Java简介和基本配置
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (原創) 未来三学期想要修的课 (日記)