简单来说:多态就是指一个相同的方法名在不同的对象调用的时候实现一样或者不一样的方法
实例1:
动物类有个方法 "嚎叫"
狗类也有个方法 "嚎叫"
猫类继承了动物类也可以调用 "嚎叫"
狗调用"嚎叫"和猫调用"嚎叫"有什么区别呢?
有区别:
两个嚎叫的内存地址是不一致的,
实现效果也会根据各自的定义不一致而实现效果不同
当然你如果定义了相同的实现效果可以实现一致
但是这并不影响猫类还是狗类都可以调用"嚎叫"这个方法. 当然为了规范性我们可以将 狗类 也继承动物类
这样实现了 猫类 狗类都是动物类 以后调用 "嚎叫" 的时候是一致的
这样更加的规范性,但是存在不一致的地方
狗叫的是汪汪汪
猫叫的是喵喵喵.
这样的强耦合性有时候会带来不便.于是我们在 狗类 和 猫类 自己的方法里面定义 "嚎叫"
猫类的 "嚎叫" 为 "miaomiaomiao"
狗类的 "嚎叫" 为 "wangwangwang"
之后狗在调用 "嚎叫" 的时候优先调用自己的 实现 "wangwangwang"
之后猫在调用 "嚎叫" 的时候优先调用自己的 实现 "miaomiaomiao" 于是对于 "嚎叫" 这个方法.在不同的场景下我们可以实现相同或者不相同的效果.


python 天生支持多态,是一门动态的强类型语言
  
  所谓动态:定义变量的时候不需要指定数据类型,系统会后台记录其像什么类型(鸭子类型),在执行的时候才会决定其类型
  所谓静态:定义的时候必须要指定数据类型,系统后台保存其类型,调用严格按照类型来,即定义之初变决定其类型.   所谓强类型语言:
    总是强制类型定义的语言
    一个变量被定义类型,不强转用于是那个类型
  所谓弱类型语言:
    数据类型可以被忽略的语言
    一个变量可以赋不同数据类型的值
  最简单的一个帮助理解的现象就是 
    定义 a = 1 b = "1" a+b 是会报错的,因为整型不能和字符串相加
    而在弱类型的语言里面比如 vbs 就是可以直接相加的

鸭子类型
  如果这个东西长得像鸭子,走路也想鸭子,那久当它是鸭子吧.
  
  不崇尚根据继承得来的相似,只是自己实现自己的代码。
  两个类刚好相似,并不产生父类子类的兄弟关系,而是鸭子类型
    比如list 和touple 非常相似用同样很多相似的方法,len,index,conent等
    list 和touple的相似是自己写代码的时候约束的,而不是通过父类约束
  
  优点:松耦合,每个相似的类之间没有影响
  
  缺点:过于随意,无硬性规定,如果删了就没了
关于鸭子类型与其他语言的对比:
  其他的语言没有鸭子类型,必须要将数据定义好类型才可以识别,
  但是用一个数据可能多个类型的时候就无法定义了,因此需要多态
    建立一个父类,将要定义的类划分父类中后,调用类的时候数据类型为父类这样就可以全部接受到
  python因为有鸭子类型因此不需要这种操作
多态和鸭子类型
python天生支持多态,传数据的时候不需要传数据类型。
其他语言需要传类型,因此需要用到子类继承父类类型来实现多类型数据的传入。 python本身有个鸭子类型,不依赖父类的情况下,实现两个不同类的同名方法的使用

接口类和抽象类在python中的应用点不是很必要

如果被问到接口类抽象类的问题的时候的面试技巧:
  python 中不崇尚使用继承,不需要用继承来规范,比较崇尚鸭子类型。
  和其他语言是不一样的,python有自己的优化方式,鸭子类型,java语言的编程方式和python是不一样的,
  python没有java的那些特性的,也没有那些约束,因此不需要用到接口类啊抽象类之类的,这些都不是必要的使用选择
  比如说python 里面的list 和touple 明明那么像但是也没有使用父类约束子类的方式来处理


关于接口类和抽象类:
  一种设计模式,是面对对象开发规范
  面向对象的开发规范 所有的接口类和抽象类都不能实例化
关于接口类
  核心词:规范 兼容
  目的是让任何方法都只是一种规范,具体的功能需要子类实现
关于抽象类
  核心词:相同 基本实现
  目的是可以对一些抽象方法做出基础实现
在java的角度上来看的区别:
java本来就支持单继承,所以有抽象类
java没有多继承,为了接口隔离原则设计了接口概念,因此得以实现多继承 python中支持单继承以及多继承,因此对于接口类和抽象类的区别就不是那么明显
甚至在python中内置就不存在接口类,但是扩展模块可以实现接口类

实例:
  通过 abc 模块中的metaclass = ABCMeta,$abstructmethod 创建抽象类
  本质上是做代码规范用,希望子类中实现和父类方法名字完全一样的方法
 1 from abc import abstractmethod,ABCMeta
2 class Payment(metaclass=ABCMeta): # 元类 默认的元类 type
3 @abstractmethod
4 def pay(self,money):pass # 没有实现这个方法
5 # 规范 :接口类或者抽象类都可以
6 # 接口类 支持多继承,接口类中的所有的方法都必须不能实现 —— java
7 # 抽象类 不支持多继承,抽象类中方法可以有一些代码的实现 —— java
8 class Wechat(Payment):
9 def pay(self,money):
10 print("已经用微信支付了%s 元" %money)
11
12 class Alipay(Payment):
13 def pay(self,money):
14 print("已经用支付宝支付了%s 元" %money)
15
16 class Applepay(Payment):
17 def pay(self,money):
18 print("已经用Applepay支付了%s 元" %money)
19
20 def pay(pay_obj,money): # 统一支付入口
21 pay_obj.pay(money)
												

day27 多态 多继承 接口类 抽象类的更多相关文章

  1. python开发面向对象基础:接口类&抽象类&多态&钻石继承

    一,接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实 ...

  2. python笔记5 接口类抽象类 封装 反射 设计模式 模块 :random随机数 josn shelve持久化存储

    接口类抽象类 接口类:接口类就是制定一个规则,让其他人按照我的规则去写程序. #!/usr/bin/env python from abc import ABCMeta,abstractmethod ...

  3. Python_015(面向对象(接口类,抽象类,多态,封装)

    一.抽象类与接口类 1.抽象类:抽象即类似或者说比较像的部分,继承描述的是父类与子类的一种关系,要找出这种关系,必须先抽象再继承; a:抽象分成两个层次: 1)由对象->类:将两个有相似地方的对 ...

  4. php中普通类 接口类 抽象类 浅谈

    一.普通类 1.关键词:class  类名,继承关键字extends 2.继承:只能实现单继承, 3.多态:子类继承可以实现多种功能 4.封装:类有权限机制,私有的只能自己用,受保护的可以被继承,子类 ...

  5. day 25-1 接口类、抽象类、多态

    # 接口类:python 原生不支持# 抽象类:python 原生支持的 接口类 首先我们来看一个支付接口的简单例子 from abc import abstractmethod,ABCMeta #我 ...

  6. python学习之老男孩python全栈第九期_day025知识点总结——接口类、抽象类、多态、封装

    一. 接口类 java:面向对象编程 设计模式 -- 接口类 接口类:python原生不支持 抽象类:python 原生支持的 from abc import abstractclassmethod, ...

  7. Python学习日记(二十五) 接口类、抽象类、多态

    接口类 继承有两种用途:继承基类的方法,并且做出自己的改变或扩展(代码重用)和声明某个子类兼容于某基类,定义一个接口类interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子 ...

  8. python之路----继承的抽象类和接口类

    抽象类与接口类 接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数 ...

  9. 【Java面试题】60 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法?

    接口可以继承接口.抽象类可以实现(implements)接口,抽象类可以继承具体类.抽象类中可以有静态的main方法. 问:  抽象类是否可继承实体类 (concrete class) 答: 抽象类是 ...

随机推荐

  1. keystone系列五:keystone源码分析

    六 keystone架构 6.1 Keystone API Keystone API与Openstack其他服务的API类似,也是基于ReSTFul HTTP实现的. Keystone API划分为A ...

  2. day87

    分页器 PageNumberPagination(普通分页器) 说明: 配置分页器的中最大显示个数(也可在setting中做全局配置) page.page_size = 2 REST_FRAMEWOR ...

  3. sql语句,查询昨天的数据

    如果在程序中,有前台传来两个时间点:beginTime和endTime,在sql查询中的限制条件就是查询昨天的数据,那么可以这样写: 但是如果在这里要查询昨天的数据的话, 则不能简单地在开始时间的那里 ...

  4. CF835F Roads in the Kingdom/UOJ126 NOI2013 快餐店 树的直径

    传送门--CF 传送门--UOJ 题目要求基环树删掉环上的一条边得到的树的直径的最小值. 如果直接考虑删哪条边最优似乎不太可做,于是考虑另一种想法:枚举删掉的边并快速地求出当前的直径. 对于环上的点, ...

  5. jdk8+Mybatis3.5.0+Mysql读取LongBlob失败

    问题:在mysql中存储base64,因为太长,基本就是几百K,所以用longBlob 描述:在mysql中,LongBlob.blob算是二进制流文件了,所以用普通的数据格式是不行的,这里用Type ...

  6. BZOJ 4804: 欧拉心算

    数论题不多BB,直接开始推导吧: \(\sum_{i=1}^n \sum_{j=1}^n \phi(gcd(i,j))\) \(=\sum_{i=1}^n \sum_{j=1}^n \sum_{d=1 ...

  7. Html页面雪花效果的实现

    简单介绍 昨天修改了一下博客所用的模板,冬天来了,给自己的博客加点雪花,感觉更有意境. 百度找到了非常多的结果,最终还是选用了cfs.snow.js,很赞压缩之后只有1kb左右,而且不会影响页面使用, ...

  8. C#大型电商项目优化(三)——扩展性与支付

    上一篇文章引来不少非议,笔者并非对EF有看法,而是针对不同的业务场景和框架背景,挑选不同的方案.每个方案都有其优势劣势,挑选最快速,最简单的方案,是笔者的初衷. 看评论也是学习的过程,然而有些只做评价 ...

  9. 手动编写的几个简单的puppet管理配置

    puppet在自动化配置管理方面有很强大的优势,这里就不做过多介绍了,下面记录下几个简单的puppet管理配置: 一.首先在服务端和客户端安装puppet和facter 1)服务端 安装Puppet ...

  10. Git版本控制器使用总结性梳理

    Git为何物?Git 是什么?大家肯定会说不就是版本控制器嘛,是的Git是目前世界上最先进的分布式版本控制系统(没有之一).1)那什么是版本控制器?举个简单的例子,比如我们用Word写文章,那你一定有 ...