Python笔记(二十)_多态、组合

多态

对于一个函数中的变量,我们只需要知道它这个变量是什么类,无需确切地知道它的子类型,就可以放心地调用类的方法,而具体调用的这个方法是作用在父类对象还是子类对象上,由运行时该对象的确切类型决定,这就是多态真正的威力

>>> class Animal:          #定义一个父类

  def run(self):

    print('animal is running...')

>>> class Dog(Animal):      #继承于Animal类

  def run(self):

    print('Dog is running...')

>>> class Cat(Animal):        #继承于Animal类

  def run(self):

    print('Cat is running...')

>>> def run_twice(animal):        #此处新建一个函数,且此函数接受一个animal类型的变量

  animal.run()

  animal.run()

当我们传入Animal的实例时,run_twice()就打印出:

>>> run_twice(Animal())

Animal is running...

Animal is running...

当我们传入Dog的实例时,run_twice()就打印出:

>>> run_twice(Dog())

Dog is running...

Dog is running...

当我们传入Cat的实例时,run_twice()就打印出:

>>> run_twice(Cat())

Cat is running...

Cat is running...

如果我们再定义一个Tortoise类型,也从Animal派生:

class Tortoise(Animal):

  def run(self):

    print('Tortoise is running slowly...')

当我们调用run_twice()时,传入Tortoise的实例:

>>> run_twice(Tortoise())

Tortoise is running slowly...

Tortoise is running slowly...

 
 

由上可以发现,多态的好处就是,当我们需要传入Dog、Cat、Tortoise……时,我们只需要接收Animal类型就可以了。

然后,按照Animal类型进行操作即可,由于Animal类型有run()方法,因此,传入的任意类型,只要是Animal类或者子类,就会自动调用实际类型的run()方法,这就是多态的意思

 

调用方只管调用,不管细节,而当我们新增一种父类的子类时,只要确保类的方法编写正确,不用管原来的代码是如何调用的。这个就是著名的“开闭”原则:

对扩展开放:允许新增Animal子类;

对修改封闭:不需要修改依赖Animal类型的run_twice()等函数

 

由于python是动态语言,所以run_twice()中不一定必须传入Animal类型,只要保证传入的对象有一个run()方法就可以了,这就是动态语言的鸭子类型

它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子

>>> class Demi:
  def run(self):
    print('demi is a girl')
>>> run_twice(Demi())
demi is a girl
demi is a girl

组合

组合指的是,在一个类中以另外一个类的实例对象作为数据属性

作用是可以将两个本来不相关的类联系起来,一般是两个类之间有显著的不同

>>>class Turtle:

  def __init__(self,x):

    self.num = x

>>>class Fish:

  def __init__(self,x):

    self.num = x

>>>class Pool:

  def __init__(self,x,y):

    self.turtle = Turtle(x)

    self.fish = Fish(y)

  def number(self):

    print("水池里总共%s只乌龟,共%s条鱼" % (self.turtle.num,self.fish.num))

有纵向关系用继承,无纵向关系用组合 

简单的说,组合用于“有一个”的场景中,继承用于“是一个”的场景中。例如,水池里有一个乌龟,天上有一个鸟,这些适合使用组合。青瓜是瓜,女人是人,鲨鱼是鱼,这些就应该使用继承

猜你喜欢

转载自www.cnblogs.com/demilisi/p/11048164.html