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()
  • 相关阅读:
    tomcat7配置
    C# FTP常规方法
    C++ 用libcurl库进行http通讯网络编程
    webkit webApp 开发技术要点总结[转]
    websocket
    Linux下使用logrotate实现日志切换
    Linux日志文件utmp、wtmp、lastlog、messages
    妙用git rebase --onto指令
    iptables命令详解和举例
    linux下IPTABLES配置详解
  • 原文地址:https://www.cnblogs.com/z18271397173/p/9127170.html
Copyright © 2011-2022 走看看