码迷,mamicode.com
首页 > 编程语言 > 详细

Python 面向对象编程——继承和多态

时间:2016-07-14 07:15:57      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:python   多态   继承   

1.1   继承和多态

1.1.1   继承

当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base classSuper class)。

>>> class Animal(object):

...    def run(self):

...        print(‘Animal is running...‘) #父类

...

>>> class Dog(Animal):

...    pass      #子类

...

>>> class Cat(Animal):

...    pass      #子类

...

>>> dog = Dog()

>>> dog.run()

Animal is running...

>>> cat = Cat()

>>> cat.run()

Animal is running...

继承的意思,子类获得了父类的全部功能。

继承的第二个好处需要我们对代码做一点改进。

Dog类修改如下

>>> class Dog(Animal):

...    def run(self):

...        print(‘Dog is running‘)       --修改部分

...

>>> dog = Dog()

>>> dog.run()

Dog is running

当子类和父类都存在相同的run()方法时,我们说,子类的run()覆盖了父类的run(),在代码运行的时候,总是会调用子类的run()

1.1.2   多态

>>> a = list() #list type

>>> b = Animal() #Animal type

>>> c = Dog() #Dog type

>>> isinstance(a, list)

True

>>> isinstance(b, Animal)

True

>>> isinstance(c, Dog)

True

>>> isinstance(c, Animal)

True

>>> isinstance(b, Dog)

False

从上,发现b仅是Animal类型不能是Dog类型;c既是Animal类型也是是Dog类型。

在继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看做是父类。但是,反过来就不行。

多态好处的理解

>>> class Animal(object):

...    def run(self):

...        print(‘Animal is running...‘)

...

>>> class Dog(Animal):

...    def run(self):

...        print(‘Dog is running...‘)

...

>>> def run_twice(x):

...    x.run()

...    x.run()

...

>>> run_twice(Animal())   --等价于b = Animal()实例化,run_twice(b)

Animal is running...

Animal is running...

>>> run_twice(Dog())

Dog is running...

Dog is running...

>>> #当我们新增一个Tortoise时,不需改变数据类型

...

>>> class Tortoise(Animal):

...    def run(self):

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

...

>>> run_twice(Tortoise())

Tortoise is running slowly...

Tortoise is running slowly...

新增Tortoise子类(理解为Animal类型),不需对run_twice函数数据类型进行修改

实际上,任何依赖Animal作为参数的函数或者方法都可以不加修改地正常运行,原因就在于多态。

多态的好处就是,当我们需要传入DogCatTortoise……时,我们只需要接收Animal类型就可以了,因为DogCatTortoise……都是Animal类型,然后,按照Animal类型进行操作即可。由于Animal类型有run()方法,因此,传入的任意类型,只要是Animal类或者子类,就会自动调用实际类型的run()方法,这就是多态的意思:

对于一个变量,我们只需要知道它是Animal类型无需确切地知道它的子类型,就可以放心地调用run()方法,而具体调用的run()方法是作用在AnimalDogCat还是Tortoise对象上,由运行时该对象的确切类型决定,这就是多态真正的威力:调用方只管调用,不管细节,而当我们新增一种Animal的子类时,只要确保run()方法编写正确,不用管原来的代码是如何调用的。这就是著名的“开闭”原则:

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

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

这里很好理解:为什么“object,这是所有类最终都会继承的类”,object类是最顶层的类。

1.1.3   静态语言vs动态语言

对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用run()方法。

对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了。

在理解上,你可以理解成类似的概念,拥有相同方法的对象,如下就是有run方法的对象。

>>> class Animal(object):

...    def run(self):

...        print(‘Animal is running...‘)

...

>>> class Dog(object):

...    def run(self):

...        print(‘Dog is running...‘)

...

>>> def run_twice(x):

...    x.run()

...    x.run()

...

>>> run_twice(Animal())

Animal is running...

Animal is running...

>>> run_twice(Dog())

Dog is running...

Dog is running...


本文出自 “90SirDB” 博客,请务必保留此出处http://90sirdb.blog.51cto.com/8713279/1826205

Python 面向对象编程——继承和多态

标签:python   多态   继承   

原文地址:http://90sirdb.blog.51cto.com/8713279/1826205

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!