多态:多态指的是一类事物有多种形态,如动物有多种形态:人,狗,猪
#定义动物这一抽象类,动物有多态:人,狗,猫
import abc
class Animal(metaclass=abc.ABCMeta): #抽象类动物
@abc.abstractmethod
def walk(self):
pass
@abc.abstractmethod
def talk(self):
pass
class People(Animal): #定义类:人
def walk(self):
print('人会走路')
def talk(self):
print('人会大声喊')
class Dog(Animal): #定义类:狗
def walk(self):
print('狗会跑')
def talk(self):
print('狗会狂吠')
class Cat(Animal): #定义类:猫
def walk(self):
print('猫会上树')
def talk(self):
print('猫会喵喵喵')
多态性
多态性:是指在不考虑实例类型的情况下使用实例,多态性分为静态多态性和动态多态性
静态多态性:如任何类型都可以用运算符+进行运算,例如字符串、列表之间在python中可以用+进行合并
动态多态性:
peo=People()
dog=Dog()
cat=Cat()
#peo、dog、pig都是动物,只要是动物肯定有talk方法
#于是我们可以不用考虑它们三者的具体是什么类型,而直接使用
peo.talk()
dog.talk()
cat.talk()
# 人会大声喊
# 狗会狂吠
# 猫会喵喵喵
更进一步,我们可以定义一个统一的接口func来使用动物会叫这一特性
def func(obj):
obj.talk()
func(peo)
func(dog)
func(cat)
# 人会大声喊
# 狗会狂吠
# 猫会喵喵喵
多态性的优点
1.增加了程序的灵活性
以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)
2.增加了程序额可扩展性
通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用
鸭子类型
Python崇尚鸭子类型,即‘如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’
python程序员通常根据这种行为来编写程序。例如,如果想编写现有对象的自定义版本,可以继承该对象
也可以创建一个外观和行为像,但与它无任何关系的全新对象,后者通常用于保存程序组件的松耦合度。
例1:利用标准库中定义的各种‘与文件类似’的对象,尽管这些对象的工作方式像文件,但他们没有继承内置文件对象的方法
例2:序列类型有多种形态:字符串,列表,元组,但他们直接没有直接的继承关系