python多态_Python 多态与抽象类

一、多态

1.1 什么是多态

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

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

1.2 多态的目的:

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

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

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

多态的三种表现形式:

继承抽象类

-耦合度极高,程序的可扩展性极低

继承父类

-耦合度高,程序的可扩展性低

鸭子类型

-耦合度低,程序的可扩展性高

#动物类

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

注意:

在python中不推荐使用抽象类。

子类必须按照父类的方法编写规范,缺一不可。(只要父类中有几个抽象方法,子类就必须要定义几个,可以多,但不能少)

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))

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页