编程原则
java具有自己的编程原则和设计模式,不能多继承。
python的编程原则:
1.开放封闭原则:开放是对扩展是开放的,封闭是对修改是封闭的(已经写完的代码程序是不能修改的)。
2.依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该应该依赖细节;细节应该依赖抽象。换言之,要针对接口编程,而不是针对实现编程

from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta): # 创建一个规范,抽象类或接口类 metaclass指定的是一个元类
@abstractmethod
def pay(self):pass # 加上装饰器pay变成抽象方法 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 fuqian(self,money):
print('使用微信支付了%s元' %money) def pay(obj,money):
obj.pay(money) w = Wechatpay()
pay(w,100) #Can't instantiate abstract class Wechatpay with abstract methods pay
3.接口隔离原则:使用多个专门的接口,而不使用单一的总接口。即客户端不应该依赖那些不需要的接口。
接口
python中没有接口,接口的概念是Java里来的,因为Java没有多继承,接口可以实现多继承。
借口类的作用:
1.在Java中能够满足接口隔离原则,且完成多继承的约束。
2.在python中,满足借口隔离原则,由于python本身支持多继承,所以就不需要接口这个概念了。
归一化设计:不管是哪个类的对象,都调用同一个函数去完成相似的功能。
class Alipay():
def pay(self,money):
print('使用支付宝支付了%s元' %money)
class QQpay():
def pay(self,money):
print('使用QQ支付了%s元' %money) def pay(obj,money):obj.pay(money)
a = Alipay()
pay(a,100) #用pay这个函数来调用
抽象类和接口类的区别:
1.在python中没什么不同,都是用来约束子类中的方法,只要是抽象类和接口类中被abstractmethod装饰的方法,都需要被子类实现,
需要注意的是,当多个类之间有相同的功能也有不同的功能的时候,应该采用多个接口类来进行分别的约束。
2.在Java中抽象类的本质是一个类,必须遵循单继承的规则,所以一个子类如果被抽象类约束,那么他只能被一个父类控制。
当多个类之间有相同的功能也有不同的功能的时候,应该采用多个接口类来进行分别的约束。
编程语言分为:
1.强类型语言——Java c++ c# 必须在相同数据类型之间做运算。
2.弱类型语言——shell语言 不同数据类型之间可以运算 如:1+'1'。
3.结余强类型和弱类型之间的语言——python,动态强类型语言,相同数据类型之间做运算。
多态:
由于java语言必须做相同数据类型之间的运算,只能通过继承父类将多个数据类型作为参数传入
java中在一个类(父类)之下发展出来的多个类的对象都可以作为参数传入一个函数或者方法。
python 天生自带多态效果(继承object类)。
class Payment: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):
pay_obj.pay(money) qq_obj = QQpay()
qq_obj.pay(100)
pay(qq_obj,100)

鸭子类型

python崇尚鸭子类型,即看起来像,叫起来像,走起路来像鸭子,那么它就是鸭子。不通过具体的继承关系来约束这些类中必须有哪些方法名,是通过一种约定成俗的概念来保证在多个类中相似的功能叫相同的名字。

class QQpay():
def pay(self,money): #看起来相同都叫pay
print('使用qq支付了%s元' % money)
class Wechatpay():
def pay(self,money):
print('使用微信支付了%s元' % money) def pay(pay_obj,money):
pay_obj.pay(money) qq_obj = QQpay()
qq_obj.pay(100)
pay(qq_obj,100)
 

面向对象—多态、鸭子类型(Day21)的更多相关文章

  1. 组合+封装+property+多态+鸭子类型(day21)

    目录 昨日回顾 继承 什么是继承 继承的目的 什么是抽象 继承背景下,对象属性的查找顺序 派生 什么是派生 子类派生出新的属性,重用父类的属性 新式类和经典类 钻石继承的继承顺序 今日内容 一.组合 ...

  2. day 28 面向对象 三种特性之一 多态 鸭子类型 反射(反省)

    多态是OOP的三大特征之一 字面意思:多种形态 多种状态 官方描述:不同的对象可以响应(调用)同一个方法 产生不同的结果(例如水的三相特征) 多态不是什么新技术 我们编写面向对象的程序时 其实就有多态 ...

  3. python 全栈开发,Day21(抽象类,接口类,多态,鸭子类型)

    一.昨日复习 派生方法和派生属性 super 只有在子父类拥有同名方法的时候, 想使用子类的对象调用父类的方法时,才使用super super在类内 : super().方法名(arg1,..) 指名 ...

  4. python之类的多态(鸭子类型 )、封装和内置函数property

    一.多态 1.什么是多态:一个类表现出的多种状态--->通过继承来实现的例如:class Animal:passclass Dog(Animal):passclass Cat(Animal):p ...

  5. 多态 鸭子类型 反射 内置方法(__str__,__del__) 异常处理

    ''' 1什么是多态 多态指的是同一种/类事物的不同形态 2 为何要有多态 多态性:在多态的背景下,可以在不用考虑对象具体类型的前提下而直接使用对象 多态性的精髓:统一 多态性的好处: 1增加了程序的 ...

  6. Python面向对象之鸭子类型

    python没有多态?他有什么? 他有鸭子类型. 鸭子类型 : 看着像鸭子,他就是鸭子. 比如一些类,他们中有一些方法,有着相同的功能, 这时为我们将这些相同功能的名字命名为一样的. 那么这些类 都互 ...

  7. PythonI/O进阶学习笔记_3.1面向对象编程_python的多态和鸭子类型

    前言: 与第一篇的面向对象内容不同的是,第一篇中的面向对象更多的是与类.对象结合起来的概念粗浅理解,就是在编程历史中诞生的一种思想方法. 这篇的面向对象编程,更多落实到在语言设计实现中,是如何体现面向 ...

  8. Python面向对象04 /封装、多态、鸭子类型、类的约束、super

    Python面向对象04 /封装.多态.鸭子类型.类的约束.super 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 3. 鸭子类型 4. 类的 ...

  9. python 面向对象专题(四):封装、多态、鸭子类型、类的约束、super

    https://www.cnblogs.com/liubing8/p/11321099.html 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 ...

随机推荐

  1. Hive的导入导出和常用过滤语句的学习

    原文: https://www.toutiao.com/i6769166601871688196/?group_id=6769166601871688196 数据的导入 load data [loca ...

  2. 最完整的springboot2.2.x.RELEASE整合springDataElasticsearch 7.6.2

    本文使用内容    springBoot2.2.5.RELEASE版本   Elasticsearch7.6.2  linux版本的   SpringDataElasticSearch与Springb ...

  3. 性能优化-使用双buffer实现无锁队列

    借助本文,实现一种在"读多写一"场景下的无锁实现方式 在我们的工作中,多线程编程是一件太稀松平常的事.在多线程环境下操作一个变量或者一块缓存,如果不对其操作加以限制,轻则变量值或者 ...

  4. 【小记录】android命令行程序发生coredump后读取堆栈信息

    一开始执行: adb shell cd /data/local/tmp ulimit -c unlimited ./xxx 然后查看coredump文件信息: adb pull /data/local ...

  5. 深入理解http1.x、http 2和https

    转自 https://segmentfault.com/a/1190000015316332 一.HTTP/1.x Http1.x 缺陷:线程阻塞,在同一时间,同一域名的请求有一定数量限制,超过限制数 ...

  6. netty系列之:请netty再爱UDT一次

    目录 简介 netty对UDT的支持 搭建一个支持UDT的netty服务 异常来袭 TypeUDT和KindUDT 构建ChannelFactory SelectorProviderUDT 使用UDT ...

  7. 定义函数返回 ax2 + bx + c = 0 的两个解

    # -*- coding: utf-8 -*- import math def quadratic(a, b, c): s = b*b - 4*a*c if a == 0: x = -c / b re ...

  8. python 小兵(9)生成器

    生成器 首先我们来看看什么是个生成器,生成器本质就是迭代器 在python中有三种方式来获取生成器 1.通过生成器函数 2.通过各种推到式来实现生成器 3.通过数据的转换也可以获取生成器 首先,我们先 ...

  9. Python打印JSON中中文的解决办法

    code #!/usr/bin/python # encoding=utf-8 import json data = [{"a": "中文"}] print j ...

  10. 一条SQL更新语句是如何执行的

    文章首发于公众号「蝉沐风」,认真写好每一篇文章,欢迎大家关注交流 这是图解MySQL的第2篇文章,这篇文章会通过一条SQL更新语句的执行流程让大家清楚地明白: 什么是InnoDB页?缓存页又是什么?为 ...