由一个示例引入鸭子类型:
- >>> class Person: # 人类
- ... def walk(self): # 走路
- ... print('this man is walking like a duck')
- ... def swim(self): # 游泳
- ... print('this man is swimming like a duck')
- ...
- >>> class Duck: # 鸭类
- ... def walk(self): # 走路
- ... print('duck is walking')
- ... def swim(self): # 游泳
- ... print('duck is swimming')
- ...
- >>> def swimming(arg):
- ... # 定义实例实现游泳功能
- ... arg.walk()
- ... arg.swim()
- ...
- >>> person = Person() # 创建Person类实例person
- >>> duck = Duck() # 创建Duck类实例duck
- >>> swimming(person) # 调用的是Person类中的walk()和swim()
- this man is walking like a duck
- this man is swimming like a duck
- >>> swimming(duck) # 调用的是Duck类中的walk()和swim()
- duck is walking
- duck is swimming
上述程序中,定义了两个类,分别为Person类和Duck类。这两个类具有同名的两个方法walk()和swim()。为了方便对相同方法的类进行统一管理,创建了一个函数swimming(),其参数是一个实例。创建Person类实例person和Duck类实例duck,然后分别调用swimming()函数,参数是person和duck,这样就通过swimming()函数分别调用了两个类中的walk()和swim()方法。如果Person类和Duck类中还有eat()和say()等多个方法,那么也可以放入swimming()函数中,通过它来调用,这样就不需要采用类的实例分别调用每一个方法,从而提高了效率。
下面是一个使用鸭子类型的示例。先创建Car类,类中包含实例属性color,实例方法run(),代码如下:
- >>> class Car:
- ... def __init__(self, color):
- ... self.color = color
- ... def run(self):
- ... print('{}小汽车在跑'.format(self.color))
- ...
再创建 Cat类,类中包含实例属性name,实例方法run(),代码如下:
- >>> class Cat:
- ... def __init__(self, name):
- ... self.name = name
- ... def run(self):
- ... print('猫咪{}在跑'.format(self.name))
- ...
然后创建公共函数get_run(),调用run()方法,代码如下:
- >>> def get_run(obj):
- ... obj.run()
- ...
最后实例化,创建Car类实例car并传递参数'红色',创建Cat类实例cat并传递参数'警长',分别以实例car和cat作为参数,使用公共函数get_run()调用实例方法run(),代码如下:
- >>> car = Car('红色')
- >>> cat = Cat('警长')
- >>> get_run(car)
- 红色小汽车在跑
- >>> get_run(cat)
- 猫咪警长在跑
通过以上示例可知,鸭子类型增加了程序的灵活性和可扩展性,提高了代码的复用性。鸭子类型与多态的区别是,鸭子类型不依靠继承,而多态依靠继承,多态功能的实现是方法的重写。