Python 面向对象多态是指通过不同的对象调用同一方法,可以得到不同的结果。其实现原理是利用 Python 自带的鸭子类型和多重继承技术。
鸭子类型
在 Python 中,一个类的类型不由该类本身决定,而是由该类所包含的方法和属性决定。如果一个对象拥有某个方法,那么它就符合该方法的实现规则。
例如:
class Duck:
def sound(self):
print("Quack")
class Cat:
def sound(self):
print("Miaow")
def make_sound(animal):
animal.sound()
以上面的代码为例,我们定义了两个类,Duck 和 Cat,它们都有 sound() 方法。make_sound() 函数接受一个参数,该参数可以是 Duck 或 Cat 实例。make_sound() 调用了该参数的 sound() 方法,由于 Duck 和 Cat 类都实现了 sound() 方法,因此 make_sound() 函数可以接受这两个类的实例。
多重继承
多重继承指一个类同时继承两个或以上的父类,从而可以获得多个父类的属性和方法。
例如:
class Animal:
def sound(self):
pass
class Duck(Animal):
def sound(self):
print("Quack")
class Cat(Animal):
def sound(self):
print("Miaow")
class DuckCat(Duck, Cat):
pass
def make_sound(animal):
animal.sound()
以上代码中我们定义了一个 DuckCat 类,它同时继承了 Duck 和 Cat 两个类。如果我们用 make_sound() 调用 DuckCat 的 sound() 方法,由于 DuckCat 继承了 Duck 和 Cat 两个类的 sound() 方法,因此 make_sound() 可以接受 DuckCat 的实例作为参数。
实例说明
示例一:多态
class Fruit:
def taste(self):
pass
class Apple(Fruit):
def taste(self):
print("Sweet")
class Banana(Fruit):
def taste(self):
print("Soft")
class Orange(Fruit):
def taste(self):
print("Sour")
def taste_fruit(fruit):
fruit.taste()
apple = Apple()
banana = Banana()
orange = Orange()
taste_fruit(apple)
taste_fruit(banana)
taste_fruit(orange)
以上代码中我们定义了一个 Fruit 类,和三个子类:Apple、Banana、Orange,它们都继承了 Fruit 类,并实现了自己的 taste() 方法。我们定义了 taste_fruit 函数,该函数接受一个参数 fruit,然后调用参数的 taste() 方法。最后我们创建了 Apple、Banana、Orange 三个实例,再调用 taste_fruit 函数,果味不同。
示例二:多重继承
class Animal:
def move(self):
print("I can move")
class Fish(Animal):
def swim(self):
print("I can swim")
class Bird(Animal):
def fly(self):
print("I can fly")
class FlyingFish(Fish, Bird):
pass
fish_bird = FlyingFish()
fish_bird.move()
fish_bird.swim()
fish_bird.fly()
以上代码中我们定义了一个 Animal 类,和两个子类:Fish、Bird,它们都继承了 Animal 类,并实现了自己的方法。我们定义了 FlyingFish 类,它同时继承了 Fish 和 Bird 两个类,并且没有重写任何方法。我们创建 FlyingFish 的实例 fish_bird,并调用它的方法,因为 FlyingFish 继承了 Fish 和 Bird 两个类的方法,因此可以调用 swim() 和 fly() 方法,同时由于 Animal 类中也定义了 move() 方法,因此 fish_bird.move() 也可以成功执行。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python面向对象多态实现原理及代码实例 - Python技术站