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

python0.15-----继承和多态

时间:2018-06-24 00:39:02      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:font   同名   不用   种类型   情况下   类之间的关系   属性   访问   疑惑   

继承:有两个类,A类和B类,当我们说A类继承自B类的时候,那么A类就拥有了B类的所有属性和方法。
object类是所有类的父类,还可以成为基类或者超类。
例如:person是object类的子类。person的属性有name,age,eat(),run()。若有100多种类型的人,那么要写100多次name,age,eat(),run()。运用继承的机制。使worker和student继承person。那么worker和student类在创建时,有已经有了name,age,eat(),run()属性和方法。

 

继承的优点
1.简化了代码,减少冗余。 100多个类不用写其父类的属性和方法。
2.提高了代码的健壮性。 若要修改代码,若用了继承的方式,有些情况只需要修改person类即可,然而若是没有使用继承,那么100多个类全都要进行修改。
3.提高了代码的安全性。 外界并不知道父类的名字,也就不能删除父类的属性和方法。
4.是多态的前提。

 

缺点:耦合和内聚是描述类与类之间的关系的。耦合是指类与类之间的联系。例如:person和worker耦合性高,worker和student耦合性低。耦合性越低,内聚性越高代码越好。

单继承的实现:
from Person import Person
class Student(Person):
  def __init__(self,name,age,book):
    self.book=book
    super(Student,self).__init__(name,age)   #super(student,self)表示Person类名,整个语句表示子类调用父类中的__init__()方法。

疑惑:为什么子类要重写__init__()方法,直接继承父类的__init__()方法不就完事了吗?No!因为__init__()方法主要目的是定义对象属性。子类相对于父类,一般会增加一些属性,例如:book,因此需要重写__init__()方法。

如果父类里面有私有属性,可以看成子类能够继承过来这个属性。只是不能在子类里面访问子类,却可以通过父类的共有方法进行修改和查找这个私有属性。


多继承的实现:
例如:子类Child继承父类Father和Mother
from Father import Father
class Child(Father,Mother):
  def __init__(self,name,age,book):
    self.book=book
    Father.__init__(name)   #多个父类直接用父类名,用super不知道选择哪一个父类名。
    Mother.__init__(age)   #注意继承的实参和形参
注意:若多个父类有相同方法名,默认调用的是括号中排前面的父类的方法。例如:上面的Child类优先调用Father的同名方法。

 

多态:表示一种事物有多种形态。主要功能也是节省代码。

例子1:定义猫和狗吃东西的类

思路:在不采用多态思想的情况下,如果猫和狗吃东西,则定义猫和狗的类,在类里面分别定义eat()的方法。如果有100种动物,则分别要在相应的类下面定义eat()方法,很麻烦。若采用多态的思想,由于猫和狗都继承自animal类,通过在animal类里面定义eat()方法让猫和狗继承就可以简化代码并实现同样的功能。少写99次eat()方法。

原始代码为:
class Cat:
  def __init__(self,name):
    self.name=name
    def eat(self):
    print(self.name+‘eat.......‘)

class Mouse:
  def __init__(self,name):
    self.name=name
    def eat(self):
    print(self.name+‘eat......‘)

采用多态的思想后的代码:
class Animal:
  def __init__(self,name):
    self.name=name
    def eat(self):
    print(self.name+‘eat......‘)

class Cat:
  def __init__(self,name):
    super(Cat,self).__init__(name)

class Mouse:
  def __init__(self,name):
    super(Cat,self).__init__(name)

现在还看不出来多态的优点,但是若是有100种动物,那么采用多态的思想后,可以少写99个eat()方法,其实还是挺简洁的。


例2:定义一个类,可以喂猫和老鼠,蛇,鸡鸭鹅等等吃东西。
思路:若是没有采用多态的思想,那么要写feedCat()方法和feedMouse(),feedSnake()等等无数个方法。采用多态的方法,只需要写feedAnimal()方法就行了。

原始代码:
class Person(object):
  def feedCat(cat):
    print(‘给你食物‘)
    cat.eat()
  def feedDog(dog):
    print(‘给你食物‘)
    dog.eat()
  …………
  def feedSnake(snake):
    print(‘给你食物‘)
    snake.eat()

采用多态思想后的代码:
class Person(object):
  def feedAnimal(animal):
    animal.eat()

python0.15-----继承和多态

标签:font   同名   不用   种类型   情况下   类之间的关系   属性   访问   疑惑   

原文地址:https://www.cnblogs.com/yulianggo/p/9219199.html

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