继承和多态

在面向对象编程中,当我们已经创建了一个类,而又想再创建一个与之相似的类,比如添加几个方法,或者修改原来的方法,这时我们不必从头开始,可以从原来的类派生出一个新的类,我们把原来的类称为父类基类,而派生出的类称为子类子类继承了父类的所有数据和方法。

让我们看一个简单的例子,首先我们定义一个 Animal 类:

  1. class Animal(object):
  2. def __init__(self, name):
  3. self.name = name
  4. def greet(self):
  5. print 'Hello, I am %s.' % self.name

现在,我们想创建一个 Dog 类,比如:

  1. class Dog(object):
  2. def __init__(self, name):
  3. self.name = name
  4. def greet(self):
  5. print 'WangWang.., I am %s. ' % self.name

可以看到,Dog 类和 Animal 类几乎是一样的,只是 greet 方法不一样,我们完全没必要创建一个新的类,而是从 Animal 类派生出一个新的类:

  1. class Dog(Animal):
  2. def greet(self):
  3. print 'WangWang.., I am %s. ' % self.name

Dog 类是从 Animal 类继承而来的,Dog 类自动获得了 Animal 类的所有数据和方法,而且还可以对父类的方法进行修改,我们看看使用:

  1. >>> animal = Animal('animal') # 创建 animal 实例
  2. >>> animal.greet()
  3. Hello, I am animal.
  4. >>>
  5. >>> dog = Dog('dog') # 创建 dog 实例
  6. >>> dog.greet()
  7. WangWang.., I am dog.

我们还可以对 Dog 类添加新的方法:

  1. class Dog(Animal):
  2. def greet(self):
  3. print 'WangWang.., I am %s. ' % self.name
  4. def run(self):
  5. print 'I am running.I am running'

使用:

  1. >>> dog = Dog('dog')
  2. >>> dog.greet()
  3. WangWang.., I am dog.
  4. >>> dog.run()
  5. I am running

多态

多态的概念其实不难理解,它是指对不同类型的变量进行相同的操作,它会根据对象(或类)类型的不同而表现出不同的行为

事实上,我们经常用到多态的性质,比如:

  1. >>> 1 + 2
  2. 3
  3. >>> 'a' + 'b'
  4. 'ab'

可以看到,我们对两个整数进行 + 操作,会返回它们的和,对两个字符进行相同的 + 操作,会返回拼接后的字符串。也就是说,不同类型的对象对同一消息会作出不同的响应

再看看类的例子:

  1. class Animal(object):
  2. def __init__(self, name):
  3. self.name = name
  4. def greet(self):
  5. print 'Hello, I am %s.' % self.name
  6. class Dog(Animal):
  7. def greet(self):
  8. print 'WangWang.., I am %s.' % self.name
  9. class Cat(Animal):
  10. def greet(self):
  11. print 'MiaoMiao.., I am %s' % self.name
  12. def hello(animal):
  13. animal.greet()

看看多态的使用:

  1. >>> dog = Dog('dog')
  2. >>> hello(dog)
  3. WangWang.., I am dog.
  4. >>>
  5. >>> cat = Cat('cat')
  6. >>> hello(cat)
  7. MiaoMiao.., I am cat

可以看到,catdog 是两个不同的对象,对它们调用 greet 方法,它们会自动调用实际类型的 greet 方法,作出不同的响应。这就是多态的魅力。

小结

  • 继承可以拿到父类的所有数据和方法,子类可以重写父类的方法,也可以新增自己特有的方法。
  • 有了继承,才有了多态,不同类的对象对同一消息会作出不同的相应。