day21接口类和抽象类,隔离原则,开放封闭原则,多态(代码片段)

zzw731862651 zzw731862651     2022-11-03     157

关键词:

一、接口类和抽象类:

# 抽象类和接口类
# java 编程原则和设计模式
# 设计模式 程序设计 具有里程碑意义的设计方式 从java中演变出来的
# 单例模式
# 一个类只有一个实例
# 算法导论 计算的方法 时间和空间的问题 权威通用

# java
# 面向对象
# java不能多继承
# 编程原则
# python
# 开放封闭原则
# 开放 对扩展是开放的
# 封闭 对修改是封闭的
# 依赖倒置原则
# 接口隔离原则
# 已经写完的程序代码是不允许修改的
#
# 支付功能的例子
# 支付宝支付
# qq支付
# apply_pay
# 微信支付
#
# 创建一个规范
from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta): # 抽象类 接口类 规范和约束 metaclass指定的是一个元类
@abstractmethod
def pay(self):pass # 抽象方法

class Alipay(Payment):
def pay(self,money):
print(‘使用支付宝支付了%s元‘%money)

class QQpay(Payment):
def pay(self,money):
print(‘使用qq支付了%s元‘%money)

class Wechatpay(Payment):
def pay(self,money):
print(‘使用微信支付了%s元‘%money)
def recharge(self):pass

def pay(a,money):
a.pay(money)

a = Alipay()
a.pay(100)
pay(a,100) # 归一化设计:不管是哪一个类的对象,都调用同一个函数去完成相似的功能
q = QQpay()
# q.pay(100)
pay(q,100)
w = Wechatpay()
pay(w,100) # 到用的时候才会报错



抽象类和接口类做的事情 :建立规范
制定一个类的metaclass是ABCMeta,
那么这个类就变成了一个抽象类(接口类)
# 这个类的主要功能就是建立一个规范
#
# 抽象类中所有被abstractmethod装饰的方法都必须被继承的子类实现
# 如果不实现,那么在实例化阶段将会报错
#
# 无论是抽象类还是接口类metaclass=ABCMeta 都不可以被实例化
# p = Payment() # 报错

二、接口隔离原则:

# 什么叫接口
# python里没有接口的概念
# 那接口是哪儿来的概念呢?
# java类没有多继承 接口可以实现多继承
# 描述动物园
# 会游泳的 会走路的 会爬树的 会飞的
# 老虎
# 青蛙
# 天鹅
# 猴子
from abc import ABCMeta,abstractmethod
class FlyAnimal(metaclass=ABCMeta):
@abstractmethod
def fly(self):pass
@abstractmethod
def cal_flying_speed(self):pass
@abstractmethod
def cal_flying_height(self):pass
class WalkAnimal(metaclass=ABCMeta):
@abstractmethod
def walk(self):pass
class SwimAnimal(metaclass=ABCMeta):
@abstractmethod
def walk(self):pass
class Tiger(WalkAnimal,SwimAnimal):
def walk(self):pass
def swim(self):pass
class Monkey:
def walk(self):pass
def climb(self):pass
class Swan(FlyAnimal,WalkAnimal,SwimAnimal):
def swim(self):pass
def walk(self):pass
def fly(self):pass
def cal_flying_speed(self):pass
def cal_flying_height(self):pass
class Parrot(FlyAnimal):
def fly(self):pass
def cal_flying_speed(self):pass
def cal_flying_height(self): pass
# 所有会飞的动物 具有一些会飞的动物的特性
# 所有会走的动物 具有一些会走的动物的特性

# 接口类的作用:
# 在java中,能够满足接口隔离原则,且完成多继承的约束
# 而在python中,满足接口隔离原则,由于python本身支持多继承,所以就不需要接口的概念了

# 抽象类和接口类
# 在python中
#并没有什么不同,都是用来约束子类中的方法的
#只要是抽象类和接口类中被abstractmethod装饰的方法,都需要被子类实现
#需要注意的是,当多个类之间有相同的功能也有不同的功能的时候,应该采用多个接口类来进行分别的约束

# 在java中
# 抽象类和接口截然不同
# 抽象类的本质还是一个类 是类就必须遵循单继承的规则,所以一个子类如果被抽象类约束,那么它只能被一个父类控制
# 当多个类之间有相同的功能也有不同的功能的时候 java只能用接口来解决问题

# 面试的时候
# 抽象类 是python中定义类的一种规范
# 接口
# 在公司类写代码的时候
# 如果遇到抽象类 记得按照抽象类中的规范一一实现对应的方法


三、多态:
# 多态
# java c++ c# —— 强类型语言
# 相同数据类型之间做运算
# def func(int a):pass
# func(‘a‘)

# shell语言 —— 弱类型语言
# 1+‘1‘
# def func(a):pass
# 1 ‘a‘ [1,2,3] ()

# 介于 强类型 与 弱类型之间 —— python 动态强类型语言
# 相同数据类型之间做运算
# def func(a):pass
class Payment:
def pay(self):pass

class QQpay(Payment):
def pay(self,money):
print(‘使用qq支付了%s元‘%money)

class Wechatpay(Payment):
def pay(self,money):
print(‘使用微信支付了%s元‘%money)
def recharge(self):pass

# def pay(Payment pay_obj,int money): # java 多态 在一个类之下发展出来的多个类的对象都可以作为参数传入这里
# pay_obj.pay(money)

# 无论是python的2.*还是3.* : 天生自带多态效果

# qq_obj = QQpay()
# print(type(qq_obj)) # 一个对象的数据类型就是它所在的类
# # # qq_obj.pay(100)
# pay(qq_obj,100)
# we_obj = Wechatpay()
# # # we_obj.pay(200)
# pay(we_obj,200)
# def len(object obj):pass
# class len_class:pass
# class tuple(len_pass):pass
# class list(len_pass):pass
# class str(len_pass):pass
# tuple list str dict set

# 鸭子类型
# class QQpay():
# def pay(self,money):
# print(‘使用qq支付了%s元‘%money)
#
# class Wechatpay():
# def pay(self,money):
# print(‘使用微信支付了%s元‘%money)
#
# def pay(pay_obj,money):
# pay_obj.pay(money)

# 索引
class list:
def index(self):pass
class str:
def index(self):pass
class tuple:
def index(self):pass
# [].index()
# ‘‘.index()
# ().index()


# 多态和鸭子类型
# 多态 通过继承实现
# java 在一个类之下发展出来的多个类的对象都可以作为参数传入一个函数或者方法
# 在python中不需要刻意实现多态,因为python本身自带多态效果
# 鸭子类型
# 不是通过具体的继承关系来约束某些类中必须有哪些方法名
# 是通过一种约定俗成的概念来保证在多个类中相似的功能叫相同的名字


# 复习课上的例子 重点记概念
# 面向对象的思维导图


设计模式原则

设计模式原则*开发/封闭原则*控制反转原则*接口隔离原则*单一职责原则开发/封闭原则类或对象及其方法对于扩展来说,应该是开放的,但是对于修改来说,应该是封闭的控制反转原则高层次的模块应该不依赖于低层次的模块,... 查看详情

面向对象设计的基本原则都有哪些

...于细节,细节应该依赖抽象。(面向抽象编程,C#为面向接口编程)。ISP 接口隔离原则接口属于用户类。(接口面用用户类,不用想着和自身层次、方法相关)REP 重用发布等价原则重用的粒度就是发布的粒度。(?这个没有... 查看详情

面向对象设计的三个原则

...原则、开放-封闭原则、Liskov替换原则、依赖倒置原则、接口隔离原则。1、单一职责原则。2、开放-封闭原则(对扩展开放;对修改关闭)。3、Liskov替换原则(子类型必须能够完全替换其父类型(继承);关注行为的替换(多态... 查看详情

charpter04开放-封闭原则

...择。他必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离那些变化。在我们最初编写代码时,假设变化不会发生。当变化发生时,我们就创建抽象类来隔离以后发生的同类变化。面向需求,对程序的改动是通过添加新... 查看详情

面向对象原则之一依赖倒置原则(代码片段)

...,分别为单一职责原则、开放封闭原则、依赖倒置原则、接口隔离原则、里氏替换原则。也有人分为六大原则,分别为单一职责原则、开放封闭原则、依赖倒置原则、接口隔离原则、里氏替换原则、迪米特法则。 现在我们来... 查看详情

面向对象原则之一里氏替换原则

...,分别为单一职责原则、开放封闭原则、依赖倒置原则、接口隔离原则、里氏替换原则。也有人分为六大原则,分别为单一职责原则、开放封闭原则、依赖倒置原则、接口隔离原则、里氏替换原则、迪米特法则。 现在我们来... 查看详情

面向对象原则之一接口隔离原则

原文:面向对象原则之一接口隔离原则前言面向对象有人分为五大原则,分别为单一职责原则、开放封闭原则、依赖倒置原则、接口隔离原则、里氏替换原则。也有人分为六大原则,分别为单一职责原则、开放封闭原则、依赖倒... 查看详情

软件设计原则

...----修改封闭。3、DIP:依赖倒置原则,一个类尽量依赖于接口等高端类(父类),尽量避免依赖于子类。4、SRP:单一职责原则,类功能越少越好。二、松耦合1、LOD:迪米特法则,即朋友最少原则,为了减少类之间的关系相互影... 查看详情

面向对象原则之一迪米特法则

...,分别为单一职责原则、开放封闭原则、依赖倒置原则、接口隔离原则、里氏替换原则。也有人分为六大原则,分别为单一职责原则、开放封闭原则、依赖倒置原则、接口隔离原则、里氏替换原则、迪米特法则。 现在我们来... 查看详情

开放/封闭原则是不是说我们不能更改类的接口?

】开放/封闭原则是不是说我们不能更改类的接口?【英文标题】:DoesOpen/ClosedPrinciplesaythatwecan\'tchangedinterfacesofourclasses?开放/封闭原则是否说我们不能更改类的接口?【发布时间】:2016-04-0306:49:16【问题描述】:请看这堂课:publ... 查看详情

面向对象原则之一开放封闭原则(开闭原则)

...,分别为单一职责原则、开放封闭原则、依赖倒置原则、接口隔离原则、里氏替换原则。也有人分为六大原则,分别为单一职责原则、开放封闭原则、依赖倒置原则、接口隔离原则、里氏替换原则、迪米特法则。 现在我们来... 查看详情

设计原则

...原则高级组件不依赖低级组件|别来找我,我会找你针对接口(抽象)编程,不针对实现(具体)编程不依赖具体类,依赖抽象即一个私有变量尽量定义为接口,而非实现类高内聚低耦合为交互对象的松耦合设计而努力,高度关... 查看详情

面向对象的五大基本原则

...方 4.依赖原则,具体依赖抽象,上层依赖下层 5.接口分离原则,模块间要通过抽象接口隔离开,而不是通过具体的类强耦合在一起 查看详情

[设计模式]面向对象设计原则

...面:封装了代码和数据规格层面:一系列可被使用的公共接口概念层面:拥有某种责任的抽象八大设计原则:依赖倒置:高层模块(稳定)不应依赖于低层模块(变化),二者都依赖于抽象(稳定);抽象(稳定)不应依赖于细... 查看详情

面向对象原则之一迪米特法则

...,分别为单一职责原则、开放封闭原则、依赖倒置原则、接口隔离原则、里氏替换原则。也有人分为六大原则,分别为单一职责原则、开放封闭原则、依赖倒置原则、接口隔离原则、里氏替换原则、迪米特法则。 现在我们来... 查看详情

设计模式六大原则

...节依赖抽象。个人解析:应该对业务逻辑进行抽象,面向接口设计,将公共部分确定,高层和底层都通过接口部分进行交互,而内部只需要关注各种实现就可以。 查看详情

面向对象的五大基本原则是

...类能出现的任何地方,这个原则也是在贯彻GOF倡导的面向接口编程!在这个原则中父类应尽可能的使用接口或者抽象类来实现! 4.依赖倒置原则(DIP)传统的结构化编程中,最上层的模块通常都要依赖下面 查看详情

3.设计模式六大原则

...展时不会修改原有代码,为了达到这样的效果,需要使用接口和抽象类)  2.里氏替换原则:对任何基类出现的地方,子类一定可以替换出现  3.依赖倒置原则:在开闭原则的基础上,针对接口编程,依赖抽象类而不去依赖... 查看详情