静态类型语言(如 Java)实现多态:

    1. abstract class Animal {
    2. void say() {
    3. System.out.println("I am an animal.");
    4. }
    5. }
    6. class Cat extends Animal {
    7. void say() {
    8. System.out.println("I am a cat.");
    9. }
    10. }
    11. class Dog extends Animal {
    12. void say() {
    13. System.out.println("I am a dog.");
    14. }
    15. }
    16. ArrayList<Animal> animals = new ArrayList<>();
    17. animals.add(new Cat());
    18. animals.add(new Cat());
    19. animals.add(new Cat());
    20. animals.add(new Dog());
    21. animals.add(new Dog());
    22. animals.add(new Dog());
    23. for (Animal anm: animals) {
    24. anm.say();
    25. }
    26. /*
    27. I am a cat.
    28. I am a cat.
    29. I am a cat.
    30. I am a dog.
    31. I am a dog.
    32. I am a dog.
    33. */

    Python 也可以这样实现:

    1. class Animal:
    2. def say(self):
    3. print('I am an animal.')
    4. class Cat(Animal):
    5. def say(self):
    6. print('I am a cat.')
    7. class Dog(Animal):
    8. def say(self):
    9. print('I am a dog.')
    10. animals = []
    11. animals.extend([Cat() for _ in range(3)])
    12. animals.extend([Dog() for _ in range(3)])
    13. for anm in animals:
    14. anm.say()

    但实际上 Python 根本不需要这样实现,Python 只需要保证 CatDog 类中包含 say 方法即可。

    1. class Cat:
    2. def say(self):
    3. print('I am a cat.')
    4. class Dog:
    5. def say(self):
    6. print('I am a dog.')
    7. animals = []
    8. animals.extend([Cat() for _ in range(3)])
    9. animals.extend([Dog() for _ in range(3)])
    10. for anm in animals:
    11. anm.say()

    鸭子类型(英语:duck typing)在程序设计中是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由 当前方法和属性的集合 决定。

    在鸭子类型中,关注点在于对象的行为,能做什么,而不是关注对象所属的类型。

    “当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”

    Python:

    1. def animal_say(anm):
    2. anm.say()
    3. animal_say(Cat())
    4. animal_say(Dog())
    5. class Xxx:
    6. def say():
    7. print('I am a xxx.')
    8. animal_say(Xxx())

    Java:

    1. void animal_say(Animal anm) {
    2. anm.say();
    3. }
    4. animal_say(new Cat());
    5. animal_say(new Dog());
    6. class Xxx extends Animal {
    7. void say() {
    8. System.out.println('I am a xxx.');
    9. }
    10. }
    11. animal_say(new Xxx());

    在常规类型中,我们能否在一个特定场景中使用某个对象取决于这个对象的类型,而在鸭子类型中,则取决于这个对象是否具有某种属性或者方法,即只要具备特定的属性或方法,就可以使用。

    鸭子类型在不使用继承的情况下使用了多态。

    Python 中广泛使用到鸭子类型,比如:
    一个类,只要实现了 __iter__()__getitem__() 方法,那么它实例化的对象就是个可迭代对象。

    1. class Company:
    2. def __init__(self, employee_list):
    3. self.employees = employee_list
    4. def __getitem__(self, index):
    5. return self.employees[index]
    6. obj = Company(['xf', 'rz', 'hyf', 'zll', 'lns'])
    7. lst = []
    8. lst.extend(obj)

    鸭子类型和魔法函数是 Python 面向对象编程的基础,是 Python 从一开始就设计好的。
    因为 Python 有鸭子类型的概念,所以我们无需用继承的方式实现多态,Python 从语言层面就是支持多态的。