面向对象三大特性之多态
面向对象三大特性之多态
1、什么是多态
多态指的是同一类事物有多种不同的形态
2、为什么要用多态
多态也称为多态性,目的是为了 在不知道对象具体类型的情况下,统一对象的调用方法的规范
3、多态的三种表现形式
1、继承父类
耦合度高,程序可扩展性低
父类:定制一套统一的规范(比如方法名统一)
子类:遵循父类的统一规范(比如子类要遵循父类方法名统一)
注意:在python中不会强制限制子类必须要遵循父类的规范,所以出现了抽象类
class Animal:
def speak(self):
pass
def eat(self):
pass
class Dog(Animal):
def speak(self): # 遵循父类的speak
print('汪汪汪~')
def eat(self): # 遵循父类的eat
print('舔狗~')
class Pig(Animal):
def speak(self): # 遵循父类的speak
print('哼哼哼~')
def eat(self): # 遵循父类的eat
print('嗯嗯嗯~')
# 统一了对象的调用方式
dog_obj = Dog()
pig_obj = Pig()
dog_obj.speak()
pig_obj.speak()
dog_obj.eat()
pig_obj.eat()
2、继承抽象类
1、什么是抽象类
在python内置的abc模块中有一个抽象类
2、抽象类的作用
让子类必须遵循父类的编写规范
3、如何实现抽象类
-
父类需要继承abc抽象类,metaclass=abc.ABCMeta
-
在父类的方法中需要装饰上,abc.abstractmethod
注意:python中不推荐使用抽象类,因为耦合度极高,可扩展性极低
子类必须按照父类的方法编写规范,缺一不可,只要父类中有多少个,子类中都要定义上
import abc
class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod
def speak(self):
pass
@abc.abstractmethod
def eat(self):
pass
class Dog(Animal):
def speak(self): # 遵循父类的speak
print('汪汪汪~')
def eat(self): # 遵循父类的eat
print('舔狗~')
class Pig(Animal):
def speak(self): # 遵循父类的speak
print('哼哼哼~')
def chi(self): # 未遵循父类的eat,则会报错TypeError: Can't instantiate abstract class Pig with abstract methods eat
print('嗯嗯嗯~')
class Cat(Animal):
def speak(self):
print('喵喵喵~')
# 缺少一个父类定义的规范会报错
# TypeError: Can't instantiate abstract class Cat with abstract methods eat
dog_obj = Dog()
# pig_obj = Pig()
dog_obj.speak()
# pig_obj.speak()
dog_obj.eat()
# pig_obj.chi()
cat_obj = Cat()
3、鸭子类型
1、什么是鸭子类型
不同的对象,只要长得像鸭子,那它就是鸭子
2、为什么要有鸭子类型
耦合度低,程序可扩展性强
不同的对象,先抽象出相同类型的方法,给他们定制一套统一 规范,所有的类,在定义时都按照统一的规范进行编写
注意:在python中推荐使用鸭子类型
# 抽象统一定制出一套规范,speak,eat
# 猪类
class Pig:
def eat(self):
print('bia唧...')
def speak(self):
print('哼哼哼...')
# 猫类
class Cat:
def eat(self):
print('咬ji 咬ji....')
def speak(self):
print('喵喵喵...')
# 狗类
class Dog:
def eat(self):
print('舔狗...')
def speak(self):
print('汪汪汪...')
# 因为都有speak和eat 所以可以定义一个speak和eat函数可以直接调用
dog = Dog()
pig = Pig()
def SPEAK(animal):
animal.speak()
def EAT(animal):
animal.eat()
SPEAK(pig)
EAT(dog)