• 7.25 面向对象之继承


    一。继承

      什么是继承?

      继承是一种关系,就是描述两者之间什么是什么的关系。

      在程序中,继承描述的是类与类之间的关系。

      例如a如果继承了b,a就具备了b的所有变量与方法,可以直接调用。

    class B:
        text=2
    
    class A(B):
        pass
    
    print(A.text)
    #2

      a称之为子类,b称之为父类,也就是基类。

      为什么要使用继承?

      在程序中,使用了继承就会提很多效率。

      继承的一方直接使用被继承一方已经有的东西。这样就可以重用已经有 的代码,提高重用性。

      如何使用继承?

      在上述例子中我们已经使用过一次继承了。

      在python中,一个子类可以继承多个父类,在其他语言中是做不到的。

    二。抽象

      抽象也是面向对象中比较重要的一个概念。

      抽象的定义就是不具体,不清除,看不懂的东西。

      在众多类中,发现其共同点,将其共同点重新建立一个类,这个过程被称之为抽象。抽象之后,所有的有其共同的点的类都可以将此抽象类作为它们的父类。

      所有为了简化开发过程,应该:

      1.先抽象再继承

      2.继承一个已经存在的类,扩展或是修改原始的功能。

    三。属性的查找顺序

    class A1:
        text=1
    
    class B2(A1):
        text=2
    
    b1=B2()
    b1.text=3
    print(b1.text)

      输出b1.text当其对象自己没有对text赋值时,会寻找该类中默认的值,如果,该类中没有,则在其父类中寻找。所有查找的顺序是:

      对象自己的 - > 所在类中 -> 找父类 - >父类的父类 ->Object

    四。派生

      当一个字类中出现了与父类中不同的内容时,这个字类就是派生类。

      而当一个子类与父类完全一样时,这个子类也就没有存在的必要了,所以,在python中每个类都是派生类。派生类就是指子类。

    五。覆盖 overrides

      覆盖指的是子类中出现了与父类完全一样答名的属性和方法。

    六。子类访问父类的方法

      在子类中,若想要访问父类中的某些方法时,需要用到super(),方法:

      1.super(当前类名称,self).你要调的父类的属性或方法

    class Father():
        def say_6(self):
            print('666')
    
    class Son(Father):
        def __init__(self):
            super(Son,self).say_6()
            super().say_6()
            Father.say_6(self)
    
    son1=Son()
    #666
    #666
    #666

      2.super().你要调的分类的属性或方法

      3.类名。你要调的父类的属性和方法(self),当子类多继承时,这类方法可以选定父类,调用其中的方法。

      这一种方法与继承无关,是存粹的父类中的方法。

    七。子类中的初始化。

      再子类覆盖了父类中__init__方法后,必须在子类中的__init__使用super方法调用父类中的__init__,并传入其所需要的参数,否则会丢失父类中的某些特征。

    class Staff:
        def __init__(self, name, gender, age, wages):
            self.name = name
            self.gender = gender
            self.age = age
            self.wages = wages
    
    class Programmer(Staff):
        def __init__(self, name, gender, age, wages,Skill):
            super().__init__(name, gender, age, wages)
            self.Skill=Skill

    八。组合。

      当我们需要某个功能,而这个功能不能通过继承来获得时,就可以使用组合。

      组合就是将另一个类当成初始属性传入另一个类中。

      举个例子,在英雄联盟中有英雄,也有装备,当英雄类需要攻击时需要攻击力,装备有攻击力,英雄需要获得攻击力并不能继承武器,因为武器和一英雄不是一类,所以可以将武器作为一个属性传入英雄类,当英雄需要攻击时,可以调用英雄中的武器进行攻击,如下,模拟了盖伦使用多兰打了瑞文10点血。

    class Equipment:
        def __init__(self,name,attack):
            self.name=name
            self.attack=attack
    
        def staff(self,opp):
            opp.hp-=10
    
    class Hero:
        def __init__(self,name,hp,equipment=1):
            self.name=name
            self.hp=hp
            self.equipment=equipment
    
    duolan=Equipment('多兰',10)
    garin=Hero('盖伦',100,duolan)
    ruiwen=Hero('瑞文',100,0)
    garin.equipment.staff(ruiwen)
    print(garin.hp,ruiwen.hp)
    #100,90

      组合比继承更加降低了耦合性。

    九。菱形继承

      当一个类有多个父类,且多个父类有共同的基类,这就叫做菱形继承。

      补充:新式类和经典类

      新式类:任何显示或隐式地继承自object的类称之为新式类(python3中任何类都是继承自object类,python全是新式类)

      经典类:不是object的子类,只有在python中出现

      补充遍历图

      图为在python3中的遍历顺序

    图为python3中的遍历

    图为python3和python2中的遍历

    当出现了菱形继承时,新式类先深度遍历,当遇到共同父类时就广度

    新式类就是深度优先。

  • 相关阅读:
    学习曲线
    正则化——“偏差(bias)”与“方差(variance)”
    诊断偏差(bias)和方差(variance)
    模型选择和训练/验证/测试数据集
    运用机器学习的建议
    训练神经网络的一般步骤
    Java数组
    类型信息(反射,RTTI)
    equals(), "== ",hashcode() 详细解释
    java并发
  • 原文地址:https://www.cnblogs.com/LZXlzmmddtm/p/11247541.html
Copyright © 2020-2023  润新知