多态
概念
????????多态性在现实生活中很普遍。动物都有交生,虽然都是“叫”,但叫声是多种多样的,列如,狗、猫、鸟、狼、狮子等叫声各不相同,即“叫”这个动作效果不同;又如,计算面积,但是长方形、圆、三角形的面积计算公式也不相同。这就是多态。
示例
我们先定义一个类Animal,然后Cat和Dog类继承Animal。
class Animal():
def whoami(self):
print('我是一只动物')
class Cat(Animal):
def whoami(self):
print('我是一只猫')
class Dog(Animal):
def whoami(self):
print('我不仅是动物,我是狗,非常狗')
写一个执行whoami方法的函数
def ops_whoami(animal):
animal.whoami
创建对象实例,执行函数调用whoami方法
animal1 = Animal()
cat1 = Cat()
dog1 = Dog()
ops_whoami(animal1)
ops_whoami(cat1)
ops_whoami(dog1)
--------------
输出:
我是一只动物
我是一只猫
我不仅是动物,我是狗,非常狗
实现类似静态语言的类型判断
Python中没有严格意义上的多态。其他语言如上述方式,在ops_whoami函数传入形参animal时,形参是要确定类型的。而python的形参不需要确认类型。
而我们可以用isinstance(),来进行类型判单。
我们添加一个非Animal的类型,Bot_duck。(Animal类及其子类的类型,都可以是Animal)
将函数加入isinstance()判断。就可以模拟实现静态语言(javaj、go)的形参的类型确定。
函数在判断类型是Animal类型的时候,才会执行whoami方法。
class Animal():
def whoami(self):
print('我是一只动物')
class Cat(Animal):
def whoami(self):
print('我是一只猫')
class Dog(Animal):
def whoami(self):
print('我不仅是动物,我是狗,非常狗')
class Bot_duck():
def whoami(self):
print('我不是动物,我是机器鸭子')
def ops_whoami(animal):
if isinstance(animal,Animal):
animal.whoami()
else:
print('不是Animal类型')
animal1 = Animal()
cat1 = Cat()
dog1 = Dog()
bot_duck1 = Bot_duck()
ops_whoami(animal1)
ops_whoami(cat1)
ops_whoami(dog1)
ops_whoami(bot_duck1)
-----------------
输出:
我是一只动物
我是一只猫
我不仅是动物,我是狗,非常狗
不是Animal类型
鸭子类型
相较于静态语言(java、go),python这样动态语言参数传入的时候不是必须要传入Animal类型。我们只需要保证传入的对象有一个whoami()方法。
这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。
class Animal():
def whoami(self):
print('我是一只动物')
class Dog(Animal):
def whoami(self):
print('我不仅是动物,我是狗,非常狗')
class Bot_duck():
def whoami(self):
print('我不是动物,我是机器鸭子')
def ops_whoami(animal):
animal.whoami()
animal1 = Animal()
dog1 = Dog()
bot_duck1 = Bot_duck()
ops_whoami(animal1)
ops_whoami(dog1)
ops_whoami(bot_duck1)
-----------------
输出:
我是一只动物
我不仅是动物,我是狗,非常狗
我不是动物,我是机器鸭子
|