多态的概念
① 指的是一类事物有多种形态
② 继承只是实现代码重用的问题,多态依附于继承,继承的体现方式
#水又多种形态:水,冰,气
class H2O:
def __init__(self,name,temperature):
self.name = name
self.temperature = temperature
def turn_ice(self):
if self.temperature < 0:
print('【%s】温度太低结冰了' % self.name)
elif self.temperature > 0 and self.temperature < 100:
print('【%s】液化成水' % self.name)
elif self.temperature > 100:
print('【%s】温度太高变成水蒸气了' % self.name)
class Water(H2O):
pass
class Ice(H2O):
pass
class Steam(H2O):
pass
w1 = Water('水',25)
i1 = Ice('冰',-20)
s1 = Steam('气',3000)
#由不同的类实例化得到的对象,调用同一个方法,执行的逻辑不同
#w1.turn_ice()
#i1.turn_ice()
#s1.turn_ice()
#python中的标准类型就是多态概念的示范,例如:类似于str1.__len__()相当于len(str1)
def func(obj):
obj.turn_ice()
#直接调用,封装成接口,不同对象都可以调用,类似于str1.__len__()相当于len(str1)
#func(w1)
#func(i1)
#func(s1)
#动物有多种形态:人,狗,猪
import abc
class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
@abc.abstractmethod
def talk(self):
pass
class People(Animal): #动物形态之一:人
def talk(self):
print('say hello')
class Dog(Animal): #动物形态之一:狗
def talk(self):
print('say wangwang')
class Pig(Animal): #动物形态之一:猪
def talk(self):
print('say aoao')
#文件有多种形态:文本文件,可执行文件
import abc
class File(metaclass=abc.ABCMeta):
@abc.abstractmethod
def click(self): #同一类事物:文件
pass
class Text(File): #文件的形态之一:文本文件
def click(self):
print('open file')
class ExeFile(File): #文件的形态之二:可执行文件
def click(self):
print('execute file')
③ python中的标准类型就是多态概念的示范
#str,list,tuple都是序列类型
s=str('hello')
l=list([1,2,3])
t=tuple((4,5,6))
#我们可以在不考虑三者类型的前提下使用s,l,t
s.__len__()
l.__len__()
t.__len__()
print(len(s)) #5
print(len(l)) #3
print(len(t)) #3
多态性的好处
① 增加了程序的灵活性:不管对象怎么变化,使用者都是同一种形式去调用,如func(obj)
② 增加了程序额可扩展性:通过继承基类创建了一个新的类,使用者无需更改自己的代码,还是可以用func(animal)去调用
import abc
class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
@abc.abstractmethod
def talk(self):
pass
class Cat(Animal): #属于动物的另外一种形态:猫
def talk(self):
print('say miao')
def func(animal):
animal.talk()
cat1 = Cat() ##实例出一只猫
func(cat1) #甚至连调用方式也无需改变,就能调用猫的talk功能
#say miao
'''
这样我们新增了一个形态Cat,由Cat类产生的实例cat1,使用者可以在完全不需要修改自己代码的情况下。使用和人、狗、猪一样的方式调用cat1的talk方法,即func(cat1)
'''
鸭子类型
Python的鸭子类型,即‘如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’
python程序员通常根据这种行为来编写程序。例如:如果想编写现有对象的自定义版本,可以继承该对象也可以创建一个外观和行为像,但与它无任何关系的全新对象
例子:利用标准库中定义的各种与文件类似的对象,尽管这些对象的工作方式像文件,但它们没有继承内置文件对象的方法
class TxtFile:
def read(self):
pass
def write(self):
pass
class DiskFile:
def read(self):
pass
def write(self):
pass