zoukankan      html  css  js  c++  java
  • 面向对象的三大特征之一:继承

    继承:

    面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。需要注意的地方:继承语法   class 派生类名(基类名)://...   基类名写作括号里,基本类是在类定义的时候,在元组之中指明的

    从类的的层面上,表示‘’什么‘’是‘’什么“”的关系

    class Hero:
        def __init__(self, name, aggresivity, life):
            self.Name = name
            self.Aggresivity = aggresivity
            self.Life =life
    
        def attract(self,enemy):
            enemy.Life -=self.Aggresivity
    class Riven(Hero):
    camp ='Noxus'
    class Garen(Hero): 
    camp
    = 'Demacia'

    g1=Garen('草丛伦',20,120)
    r1=Riven('潇洒哥',30,100)

    在该例中,Garen类继承了Hero类:

    用上面的湖来说就是,'Garen是Hero'

    何时使用继承:假如我需要定义几个类,而类与类之间有一些公共的属性和方法,这时我就可以把相同的属性和方法作为基类的成员,而特殊的方法及属性则在本类中定义,这样只需要继承基类这个动作,就可以访问到基类的属性和方法了,它提高了代码的可扩展性。

    在上面的例子中:把Geren类中的__init__()省略。,通过继承Hero达到节省代码.

    继承:是基于抽象的结果。抽取比较相像的部分(在上面就是对特征的相似,都有名字,生命值,攻击力)

    属性查找:先从对象的命名空间找》》自己的类的命名空间中找》》》父类中找》》》》

    class Foo:
        def f1(self):
            print('from Foo.f1')
            self.f2() #self=b1 self.f2
    
        def f2(self):
            print('from Foo.f2')
    
    
    class Bar(Foo):
        def f2(self):
            print('from Bar.f1')
    
            
    b1 = Bar()
    b1.f1()

    结果:

    from Foo.f1
    from Bar.f1

      当b1调用f1的时候,发现自己没有,同时自己所在的类中也没有f1(),就在父类Foo中查找,显然,Foo中有f1()。所以就运行,结果为from Foo.f1。而接着就是运行self.f2(),在b1 中没有f2(),但是在对象b1所在的类中有f2(),所以运行结果就是from Bar.f2

    继承的 实现:

    对于在继承过程中,python会计算出一个方法解析顺序(MRO)列表,它是一个简单的所有基类的线性列表>

    class Foo:
        pass
    
    
    class Aor:
        pass
    
    
    class Bar(Foo,Aor):
        pass
    
    
    print(Bar.__mro__)

    通过__mro__方法可以找出继承顺序:

    (<class '__main__.Bar'>, <class '__main__.Foo'>, <class '__main__.Aor'>, <class 'object'>)

    MRO列表遵循如下三点:

    1.子类优先父类被检查。

    2.多个父类会根据它们在列表中的顺序被检查

    3.如果对下一个类存在两个合法的选择(遵循2条件)

    存在多个父类的情况下:

    属性查找方式有:深度优先和广度优先。

    一般来讲,经典类在多继承的情况下会按照深度优先的方式查找,新式类会按照广度优先的方式查找.

    在python3中都是新式类,因为他们默认继承object

    Bar.__bases__得到父类。

    在新式类中:

    如果,没有共同的头部类型

    查找顺序:ClassA>ClassB>ClassC>ClassD>ClassE>ClassF>object

    当有共同头部父类的类型时:

    查找顺序:ClassA>ClassB>ClassC>ClassE>ClassF>ClassF>ClassG>ClassD>object

    子类调用父类的方法(内置函数super):

    class People:
        def __init__(self,name,age,sex):
            self.name=name
            self.age=age
            self.sex=sex
        def foo(self):
            print('from parent')
    
    class Teacher(People):
        def __init__(self,name,age,sex,salary,level):
            #在python3中
            super().__init__(name,age,sex) #调用父类的__init__的功能,实际上用的是绑定方法,用到了mro表查询继承顺序,只能调用一个父类的功能
            #在python2中
            # super(Teacher,self).__init__(name,age,sex)    #super(Teacher,self)是一个死格式
            self.salary=salary
            self.level=level
        def foo(self):
            super().foo()
            print('from child')
    
    t=Teacher('bob',18,'male',3000,10)
    print(t.name,t.age,t.sex,t.salary,t.level)
    t.foo()
  • 相关阅读:
    7个技巧,帮你完美搞定网页首图设计(必看)
    听说你想跳槽?ARM和PowerPC分析,你知道吗?(速进)
    C语言必学7大步骤!(必看)
    单片机电机必不可少的30条常识!你知道吗?(欢迎大家进行补充)
    单片机外围电路设计攻略(终结版)! 不看哭一年!
    3天”速成“嵌入式之后,我明白了六件事!!!
    前端就不需要掌握算法与数据结构?
    嵌入式软件必学知识总结!
    字节跳动2017客户端工程师实习生笔试题-第四题
    并查集
  • 原文地址:https://www.cnblogs.com/z18271397173/p/9127170.html
Copyright © 2011-2022 走看看