zoukankan      html  css  js  c++  java
  • python0.15-----继承和多态

    继承:有两个类,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()

  • 相关阅读:
    C++ 如何判断所调用的重载函数
    C++ 入门5 类和动态内存分配(一)
    c#动态创建ODBC数据源
    设为首页,加入收藏,联系我们
    ASP.NET 2.0中CSS失效
    typedef的四个用途和两个陷阱(转)
    VC++实现应用程序对插件的支持(转)
    DOM无关事件
    How to Migrate from WCF Web API to ASP.NET Web API
    Using ASP.NET Web API with ASP.NET Web Forms
  • 原文地址:https://www.cnblogs.com/yulianggo/p/9219199.html
Copyright © 2011-2022 走看看