类的“多态”
多态
1)、什么是多态
多态指的是同一种类型的事物,不同的形态
2)、多态的目的
“多态” 也称之为 “多态性”,目的是为了 在不知道对象具体类型的情况下,统一对象调用方法的规范(比如:名字)
3)、多态的三种表现形式
① 继承父类
② 继承抽象类
③ 鸭子类型
1、继承父类
多态的表现 “形式之一” 就是 继承父类
如何实现:
- 先抽象(即总结子类和父类的相同属性及方法),再继承
父类:定制一套统一的规范(比如:方法名统一)
子类:继承父类,遵循父类的统一的规范(比如:子类遵循父类方法名的统一)
# 动物类
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("汪汪汪...")
animal1 = Pig()
animal2 = Cat()
animal3 = Dog()
animal1.speak()
animal2.speak()
animal3.speak()
执行结果:
哼哼哼...
喵喵喵...
汪汪汪...
注意:在python中不会强制限制 子类 必须要遵循 父类 的规范,所以出现了 继承抽象类
2、继承抽象类
1)什么是抽象类
在python内置的abc模块中,有一个抽象类,使用此类,使子类必须遵循父类的编码规范(不遵循,调用即报错)
2)抽象类的作用
只要父类继承了抽象类,子类就必须遵循父类的编码规范
3)如何实现抽象类
父类需要继承abc模块中:metaclass=abc.ABCMeta
在父类的需要遵循编码规范的方法上装饰上abc.abstractmethod
注意:子类必须要按照父类的方法编写规范,缺一不可。(只要父类中有几个抽象方法,子类就要有几个抽象方法)
例:写一个抽象类
import abc # 父类需要继承abc模块中:metaclass=abc.ABCMeta class Animal(metaclass=abc.ABCMeta): # 在父类的需要遵循编码规范的方法上装饰上abc.abstractmethod @abc.abstractmethod def eat(self): pass # 在父类的需要遵循编码规范的方法上装饰上abc.abstractmethod @abc.abstractmethod def speak(self): pass # 猪类 class Pig(Animal): # 根据父类编码规范必须要有eat方法(方法名不能变) def eat(self): print("bia叽...") # 根据父类编码规范必须要有speak方法(方法名不能变) def speak(self): print("哼哼哼...") # 此方法无要求,可有可无 def run(self): print("pig is running...")
pig_obj = Pig()
3、鸭子类型
1)什么是鸭子类型
不同的对象,只要长得像鸭子,动物行为像鸭子,那就是鸭子!
“鸭子类型” 是多态的表现形式之一
PS:多态(继承父类、继承抽象类、鸭子类型)其实就是代码的规范形式,即编码规范
2)如何实现鸭子类型
不同对象,先抽象出相同类型的方法,给他们定制一套统一的规范
所有的类,在定义时都按照统一的规范进行编写
注意:在python中,强烈推荐鸭子类型
# 动物类:定义代码规范
class Animal:
def eat(self):
pass
def speak(self):
pass
# 猪类:按照动物类的代码规范来编写
class Pig:
def eat(self):
print("bia叽...")
def speak(self):
print("哼哼哼...")
# 猫类:按照动物类的代码规范来编写
class Cat:
def eat(self):
print("咬叽...")
def speak(self):
print("喵喵喵...")
# 狗类:按照动物类的代码规范来编写
class Dog:
def eat(self):
print("舔叽...")
def speak(self):
print("汪汪汪...")
4、多态总结
多态的三种表现形式:
继承父类:
耦合度高,程序的可扩展性低
继承抽象类:(强烈不推荐使用)
耦合度极高,程序的扩展性极低
鸭子类型:(强烈推荐使用)
耦合度低,程序的可扩展性高