Python 继承与多态

继承

在第一节中,我们创建了一个Dog的类并学会了如何使用这个类来创建对象。在实际的应用中,如果我们需要创建其它的类,比如猫、猪、羊…..,我们可以分别创建不同的类。但是很多动物我们发现有很多共同的属性,比如体重、颜色等,这样就会造成代码的重用。我们可以采用继承来优化这些类的设计。继承是面向对象的重要特征之一,它表征了两个类或者说多个类之间的父子关系。子类继承父类的所有属性和方法,子类中可以添加自己的特有的属性和方法。比如,我们可以定义一个动物的类animal,通过继承animal这个类,我们可以将动物的一些通用属性(比如年龄、体重、颜色等属性)继承到子类中,同时,由于不同的动物可能有自己的属性或者行为,我们就可以在子类中定义该动物特有的属性和行为。比如我们需要创建一个鲸鱼的类whale:

# -*- coding:utf-8 -*-
#Filename:class.py
class Animal:
    animal_num = 0
    def __init__(self, name):
        self.name = name
        Animal.animal_num = Animal.animal_num + 1
        print 'Create a object:%s'%self.name
        print 'Animals number:%d'%Animal.animal_num
    def speak(self):
        print '%s:speaking'%self.name
class Dog(Animal):
    def __init__(self, name, age):
        Animal.__init__(self, name)
        self.age = age
        print 'init Dog:age = %d'%self.age
    def speak(self):
        Animal.speak(self)
        print '%s:wangwang'%self.name
class Whale(Animal):
    def __init__(self, name, age):
        Animal.__init__(self, name)
        self.age = age
        print 'init Whale:age = %d'%self.age
    def speak(self):
        print '%s:engeng---'%self.name
    def swim(self):
        print 'whale swimming function'
dog = Dog('dog',23)
dog.speak()
whale = Whale('whale',34)
whale.speak()
whale.swim()

运行结果:

C:\Python27\python.exe F:/python/python_proj/class.py
Create a object:dog
Animals number:1
init Dog:age = 23
dog:speaking
dog:wangwang
Create a object:whale
Animals number:2
init Whale:age = 34
whale:engeng---
whale swimming function

Process finished with exit code 0

首先我们定义了一个animal的基本类,定义动物类的一些基本属性和行为,然后我们以Animal为父类,通过继承创建了2个新的类Dog和Whale。我们把基本来作为一个元组放到新定义类名称之后就可以达到继承的目的。当我们使用新建的类dog和whale创建对象时,需要显示调用基本类的方法,这样基本类Animal的__init__ 和其他方法将会被调用,否则,将只有子类的方法被调用,因为Python是不会调用基本类的构造函数。在创建whale类时,我们没有显式调用基本类Animal的speak方法,我们可以看到该方法在创建对象时没有调用。
在子类继承父类后,我们可以在子类中添加新的属性和方法,如Dog类增加一个age属性,Whale类中,因为鲸鱼是一种特殊的哺乳动物,所以我们增加一个swim的方法。

多重继承

在我们创建鲸鱼类Whale中,我们可以看到,鲸鱼作为一种特殊的哺乳动物,除了具有动物的基本属性和方法外,同时有具有鱼类的属性和方法,面向对象的继承机制允许一个子类从多个父类继承。

# -*- coding:utf-8 -*-
#Filename:class.py
class Animal:
    animal_num = 0
    def __init__(self, name):
        self.name = name
        Animal.animal_num = Animal.animal_num + 1
        print 'Create a Animal object:%s'%self.name
        print 'Animals number:%d'%Animal.animal_num
    def speak(self):
        print '%s:speaking'%self.name
class Fish:
    fish_number = 0
    def __init__(self, name):
        self.name = name
        Fish.fish_number = Fish.fish_number + 1
        print 'Create a Fish object:%s'%self.name
        print 'Fish number:%d'%Fish.fish_number
    def swim(self):
        print 'Fish swimming'
class Whale(Animal, Fish):
    def __init__(self, name, age):
        Animal.__init__(self, name)
        self.age = age
        print 'init Whale:age = %d'%self.age
    def speak(self):
        Animal.speak(self)
        print '%s:engeng---'%self.name
    def swim(self):
        Fish.swim(self)
        print 'whale swimming function'
whale = Whale('whale',34)
whale.speak()
whale.swim()

在新建类的后面元组内,添加我们需要继承多个父类的名称,就可以实现多重继承。运行结果如下:

C:\Python27\python.exe F:/python/python_proj/class.py
Create a Animal object:whale
Animals number:1
init Whale:age = 34
whale:speaking
whale:engeng---
Fish swimming

Process finished with exit code 0

从运行结果可以看到,当我们多重继承时,在构造函数中,需要显示指定继承哪一个父类的基本初始化函数。我们通过Animal.__init__ (self,name)使用Animal的__init__ 方法来构造子类Whale的__init__ 方法,同样我们也可以使用Fish 的方法来完成,多重继承使用的时候,一定要注意同名的继承情况。子类中同样也可以显式调用父类的方法。当子类中没有显式调用,Python会根据多重继承规则,到父类中进行查找。

# -*- coding:utf-8 -*-
#Filename:class.py
class Animal:
    animal_num = 0
    def __init__(self, name):
        self.name = name
        Animal.animal_num = Animal.animal_num + 1
        print 'Create a Animal object:%s'%self.name
        print 'Animals number:%d'%Animal.animal_num
    def speak(self):
        print '%s:speaking'%self.name
class Fish:
    fish_number = 0
    def __init__(self, name):
        self.name = name
        Fish.fish_number = Fish.fish_number + 1
        print 'Create a Fish object:%s'%self.name
        print 'Fish number:%d'%Fish.fish_number
    def swim(self):
        print 'Fish swimming'
class Whale(Animal, Fish):
    def __init__(self, name, age):
        Fish.__init__(self, name)
        self.age = age
        print 'init Whale:age = %d'%self.age
    def speak(self):
        Animal.speak(self)
        print '%s:engeng---'%self.name
whale = Whale('whale',34)
whale.speak()
whale.swim()

在这段示例代码中,我们使用Fish的 __init__ 方法,当代码运行whale.swim()时,会通过查找,运行Fish父类中的swim方法。

C:\Python27\python.exe F:/python/python_proj/class.py
Create a Fish object:whale
Fish number:1
init Whale:age = 34
whale:speaking
whale:engeng---
Fish swimming

Process finished with exit code 0
《Linux三剑客》视频教程,从零开始快速掌握Linux开发常用的工具:Git、Makefile、vim、autotools、debug,免费赠送C语言视频教程,C语言项目实战:学生成绩管理系统。详情请点击淘宝链接:Linux三剑客