多态的含义

多态性指的是可以在不用考虑对象具体类型的情况下而直接使用对象,这就需要在设计时,把对象的使用方法,统一成一种

基本使用

  1. class Animal(object):
  2. def speak(self):
  3. pass
  4. class Cat(Animal):
  5. def speak(self):
  6. print('喵喵喵')
  7. class Dog(Animal):
  8. def speak(self):
  9. print('汪汪汪')
  10. class Pig(Animal):
  11. def speak(self):
  12. print('哼哼哼')
  13. cat = Cat()
  14. dog = Dog()
  15. pig = Pig()
  16. # 调用一个相同的方法,方便管理
  17. cat.speak()
  18. # 喵喵喵
  19. dog.speak()
  20. # 汪汪汪
  21. pig.speak()
  22. # 哼哼哼
  23. """
  24. 多态性的好处在于增强了程序的灵活性和可扩展性,比如通过继承Animal类创建了一个新的类,实例化得到的对象obj,可以使用相同的方式使用obj.speak()
  25. """

拓展

知识一

面向对象的多态性,在很早之前就已经接触过了

  1. s = '123'
  2. l = [1, 2, 3, 4]
  3. d = {'name': 'kevin', 'age': 22}
  4. print(len(s))
  5. print(len(l))
  6. print(len(d))

知识二

python中提供了强制性的措施来实现多态性(不推荐使用)

  1. import abc
  2. # 指定metaclass属性将类设置为抽象类,抽象类本身只是用来约束子类的,不能被实例化
  3. class Animal(metaclass=abc.ABCMeta):
  4. @abc.abstractmethod # 该装饰器限制子类必须定义有一个名为talk的方法
  5. def talk(self): # 抽象方法中无需实现具体的功能
  6. pass
  7. class Cat(Animal): # 但凡继承Animal的子类都必须遵循Animal规定的标准
  8. def talk(self):
  9. pass
  10. cat = Cat() # 若子类中没有一个名为talk的方法则会抛出异常TypeError,无法实例化

鸭子理论

这个概念的名字来源于由James Whitcomb Riley提出的鸭子测试,“鸭子测试”可以这样表述:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子

  1. class Duck(object):
  2. def walk(self):
  3. print("I walk like a duck")
  4. def swim(self):
  5. print("I swim like a duck")
  6. class Person(object):
  7. def walk(self):
  8. print("this man walk like a duck")
  9. def swim(self):
  10. print("this man swim like a duck")

可以看到,我们定义了一个Duck类,有walkswim、两个方法,同时,也·定义了一个Person类, Person类拥有跟Duck类一样的方法。当有一个函数调用Duck类,并利用到了s个方法walk()swim()。传入Person类也一样可以运行,Python中的函数并不会检查对象的类型是不是Duck,只要它拥有walk()swim()方法,就可以正确的被调用