一、多态

1.1 什么是多态

多态也称“多态性”,指的是同一种类型的事物,不同的形态。

在python中的多态指的是让多种类若具备类似的数据属性与方法属性,都统一好命名规范,这样可以提高开发者的代码统一性,使得调用者更方便去理解。

1.2 多态的目的:

为了在不知道对象具体类型的情况下,统一对象调用方法的规范(名字)

父类: 定制一套统一的规范。(比如: 方法名统一)

子类: 遵循父类的统一的规范。(比如: 子类遵循父类方法名的统一)

多态的三种表现形式

  1. 继承抽象类

    -耦合度极高,程序的可扩展性极低
  2. 继承父类

    -耦合度高,程序的可扩展性低
  3. 鸭子类型

    -耦合度低,程序的可扩展性高
#动物类
class Animal:
#方法:吃
def eat(self):
pass
#方法:叫
def speak(self):
pass #猪类
class Pig(Animal):
def eat(self):
print('bia唧')
def speak(self):
print('哼哼哼') #猫类
class Cat(Animal):
def eat(self):
print('咬...')
def speak(self):
print('喵喵喵')
#狗类
class Dog(Animal):
def eat(self):
print('叫...')
def speak(self):
print('汪汪汪') pig1 = Pig()
cat1 = Cat()
dog1 = Dog() # 设置一个接口
def SPEAK(obj):
obj.speak() SPEAK(pig1) #pig1.speak()
SPEAK(cat1) #cat1.speak()
SPEAK(dog1) #dog1.speak()

1.3 多态的好处:

1.增加了程序的灵活性

  以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)

2.增加了程序的可扩展性

  通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用  

class People(Animal): #属于动物的另外一种形态:人
def speak(self):
print('say hi') def func(people): #对于使用者来说,自己的代码根本无需改动
people.speak() people1=People() #实例出一个人
func(people1) #甚至连调用方式也无需改变,就能调用人的talk功能
'''
这样我们新增了一个形态People,由People类产生的实例people1,使用者可以在完全不需要修改自己代码的情况下,
使用和猫、狗、猪一样的方式调用people1的speak方法,即func(people1)
'''

二、抽象类

2.1 什么是抽象类?

在python内置的abc模块中,有一个抽象类,让子类必须遵循父类的编写规范。

2.2 如何实现抽象类

  • 父类需要继承abc模块中的metaclass=abc.ABCMeta
  • 在父类的方法中,需要装饰上 abc.abstractmethod

注意:

  1. 在python中不推荐使用抽象类。
  2. 子类必须按照父类的方法编写规范,缺一不可。(只要父类中有几个抽象方法,子类就必须要定义几个,可以多,但不能少)
import abc
#动物类
class Animal(metaclass = abc.ABCMeta):
#方法:吃
@abc.abstractmethod
def eat(self):
pass
#方法:叫
@abc.abstractmethod
def speak(self):
pass #猪类
class Pig(Animal):
def eat(self):
print('bia唧') def speak(self):
print('哼哼哼') pig1 = Pig()
pig1.eat()

三、鸭子类型

3.1 什么是鸭子类型

python崇尚鸭子类型,不同的对象,只要长得像鸭子,动作行为像鸭子,那它就是鸭子。

鸭子类型是多态的一种表现形式。

3.2 为什么要有鸭子类型

不同对象,先抽象出相同类型的方法,给他们定制一套统一的规范。所有的类,在定义时都按照统一的规范进行编写。

#二者都像鸭子,二者看起来都像文件,因而就可以当文件一样去用
class TxtFile:
def read(self):
pass def write(self):
pass class DiskFile:
def read(self):
pass
def write(self):
pass
序列类型:list,str,tuple

l = lisst([1,2,3])
s = str('hello')
t = tuple((1,2,'a')) #我们可以在不考虑三者类型的前提下使用s,l,t
l.__len__()
s.__len__()
t.__len__()
str1 = 'bh'
list1 = [1,2,3] # print(str1.__len__())
# print(list1.__len__()) # 自定义统计长度函数
def LEN(obj):
return obj.__len__() print(LEN(str1))
print(LEN(list1))

Python 多态与抽象类的更多相关文章

  1. c#多态之抽象类与接口的一点收获~~

    多态之抽象类与接口的相似点及不同点,刚学习的一点收获,或许不是很完整,借鉴看视频及一些被人写的文章自己写的下的一些心得!以便之久复习使用! 一.抽象类 (1) 抽象方法只作声明,而不包含实现,可以看成 ...

  2. c#多态之抽象类与虚方法的异同点~

    多态之抽象类与虚方法的相似点及不同点 : 不同点 1.方法关键字不一样 虚方法的方法关键字是:virtual. 抽象类的方法关键词是:abstract 2.基类的方法是否有方法体/实现 虚方法的方法: ...

  3. 多态、抽象类、接口_DAY09

    1:多态(掌握) (1)多态概念:一种事物的多种形态 (2)体现:父类的引用指向其子类的实例对象;接口的引用指向其实现类的实例对象 (3)特点: 成员方法:编译看左边,运行看右边 运行:子类重写的方法 ...

  4. 201621044079 week05-继承、多态、抽象类与接口

    作业05-继承.多态.抽象类与接口 1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 接口 interface关键字 implements has-a;comparable co ...

  5. lesson 4 再谈继承多态,抽象类和接口

    再谈多态,抽象类和接口 上一次博客已经概念性的概述了继承多态,抽象类和接口,这次来具体的谈一谈他们之间的联系和需要注意的地方. 一.继承和多态:Inheritance (继承) & Polym ...

  6. Week06-继承、多态、抽象类与接口

    Week06-继承.多态.抽象类与接口 1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 关键字:接口,Comparable,interface关键字,Comparator,继承 ...

  7. 第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类

    第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一.    引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不 ...

  8. python day - 19 抽象类 接口类 多态 封装

    一. 抽象类接口类即制定一个规范 特点: 1.不可被实例化. 2.规范子类当中必须事先某个方法. 3.在python中有原生实现抽象类的方法,但没有原生实现接口类的方法. 例题:制定一个规范就是,子类 ...

  9. python多态和规范

    python规范(接口类) 接口类可以规范代码,但接口类本身是不实现的 class Payment: def pay(self,money): raise Notlmplemented class W ...

随机推荐

  1. Java练习 SDUT-1188_各位数字之和排序

    C语言实验--各位数字之和排序 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给定n个正整数,根据各位数字之和从小到大 ...

  2. qt 自定义窗口绘制正弦曲线

    circlewidget.h #ifndef CIRCLAWIDGET_H #define CIRCLAWIDGET_H #include <QFrame> #include<QVe ...

  3. 异常处理之try catch finally

    package com.sxt.wrapper.test2; /* 0418 * 异常处理 * 采用异常处理的好处:保证程序发生异常后可以继续执行 * e.printStaceTrace:打印堆栈信息 ...

  4. @hdu - 6598@ Harmonious Army

    目录 @description@ @solution@ @accepted code@ @details@ @description@ n 个士兵,每个士兵可以选择加入 A 组或 B 组. 有 m 个 ...

  5. oracle多个平等的索引

    当SQL语句的执行路径可以使用分布在多个表上的多个索引时, ORACLE会同时使用多个索引并在运行时对它们的记录进行合并, 检索出仅对全部索引有效的记录. 在ORACLE选择执行路径时,唯一性索引的等 ...

  6. C#循环语句练习(二)

    1.求1!+2!+...+n! 所有阶乘的和 2.求100以内的质数 (1)第一种做法 (2)另一种做法 3. 总数=幼兔+小兔+成兔成兔=上个月的小兔+上个月的成兔小兔=上个月的幼兔幼兔=这个月的成 ...

  7. 关于top命令

    top命令交互操作指令 下面列出一些常用的 top命令操作指令 q:退出top命令 :立即刷新 s:设置刷新时间间隔 c:显示命令完全模式 t::显示或隐藏进程和CPU状态信息 m:显示或隐藏内存状态 ...

  8. 4-10 items设计

    1,items相当于dict,但是又比字典好 2,parse.urljoin(response.url,post_url)方法,其中image_url是一个域名的话,其中的当前域名就不用再添加. yi ...

  9. P1102 走迷宫二

    题目描述 大魔王抓住了爱丽丝,将她丢进了一口枯井中,并堵住了井口. 爱丽丝在井底发现了一张地图,他发现他现在身处一个迷宫当中,从地图中可以发现,迷宫是一个N*M的矩形,爱丽丝身处迷宫的左上角,唯一的出 ...

  10. Redis 命令行工具能这样用你知道了吗?

    我们天天都在使用 Redis 内置的命令行工具 redis-cli,久而久之以为它就是一个简单的交互式 Redis 数据结构手工操作程序,但是它背后强大的功能绝大多数同学可能闻所未闻.本节我们一起来挖 ...