zoukankan      html  css  js  c++  java
  • 类的继承

    继承

    是一种新建类的方式,子类继承了一个父类,子类就有了父类的属性和方法

    通常我们叫父类叫做基类,叫子类叫做派生类

    新式类

    只要继承了object类,就是新式类,再python3中,默认继承object类。所以在python3中所有的类都是新式类。

    python2中,类需要指定继承object类才是新式类

    经典类

    没有继承object的类,就是经典类

    所以在python3中是没有经典类的,因为python3中默认继承object类

    在python2中只要是没有指定继承object的都是经典类

    子类继承父类就还获得父类的公共属性与公共方法

    class A:
        name = 'gredae'
        def f1(self):
            print('A的f1方法。。。')
    
    class B(A):
        age = 18
        def f2(self):
            print('B的f2方法。。。')
    
    b = B()
    print(b.name)   # gredae
    print(b.age)   # 18
    b.f1()   # A的f1方法。。。
    b.f2()   # B的f2方法。。。
    

    类的多继承

    class A:
        name = 'gredae'
        def f1(self):
            print('A的f1方法。。。')
    
    class B():
        age = 18
        def f2(self):
            print('B的f2方法。。。')
    
    class C(A,B):
        pass
    
    c = C()
    print(c.name)   # gredae
    print(c.age)   # 18
    c.f1()   # A的f1方法。。。
    c.f2()   # B的f2方法。。。
    

    类的多层继承

    class A:
        name = 'gredae'
        def f1(self):
            print('A的f1方法。。。')
    
    class B(A):
        age = 18
        def f2(self):
            print('B的f2方法。。。')
    
    class C(B):
        pass
    
    c = C()
    print(c.name)   # gredae
    print(c.age)   # 18
    c.f1()   # A的f1方法。。。
    c.f2()   # B的f2方法。。。
    

    继承的菱形问题:新式类和经典类的查找顺序是不一样的

    新式类的查找属性:广度优先搜索

    新式类(py3中全是新式类):广度优先---从左侧开始,一直往上找,找到菱形的顶点结束(不包括菱形顶点),继续下一个继承的父类往上找,找到菱形的顶点结束(不包括菱形顶点),最后找到菱形顶点。

    经典类的查找属性:深度优先搜索

    经典类(只有py2中才有):深度优先---从左侧开始,一直往上找,找到菱形的顶点结束(包括菱形顶点)继续下一个继承的父类往上找,找到菱形的顶点结束(不包含菱形定点)

    属性的查找顺序

    对象 ----> 类中找 ----> 父类中找(多继承) ----> 报错

    利用继承减少代码冗余

    通过将不同类里相同的属性与方法进行提取,再新建一个类,让功能复用的类去继承新建的这个类,这样就可以做到减少代码冗余的目的

    子类中调用父类的方法

    1. 使用类名调用其他类方法

      class A:
          def __init__(self,name,age):
              self.name = name
              self.age = age
      
      class B():
          def __init__(self,name,age,sex):
              A.__init__(self,name,age)
              self.sex = sex
      
      b = B('abc',20,1)
      print(b.name)   # abc
      print(b.age)   # 20
      print(b.sex)   # 1
      
    2. 使用关键字 super 调用父类方法

      class A:
          def __init__(self,name,age):
              self.name = name
              self.age = age
      
      class B(A):
          def __init__(self,name,age,sex):
              super().__init__(name,age)
              self.sex = sex
      
      b = B('abc',20,1)
      print(b.name)   # abc
      print(b.age)   # 20
      print(b.sex)   # 1
      

    使用 super 关键字的前提是被调用的类是该类的直接父类。并且 super 关键字是按照mro列表寻找父类,如果该类的父类是object类,那么就会报错。因为object类是空白类,自然也就找不到方法。

    使用类名来调用其方法可以不是继承关系,如果要使用多层继承关系的父类的方法,就只能使用类名调用方法的途径来调用间接父类的方法。

  • 相关阅读:
    探讨变量的内存分配方式
    色彩之RGB和灰阶
    Perl语言:qw简写
    【转】位操作
    [转]Perl学习笔记
    Spaghetti code&Ravioli code&Lasagna code&Spaghetti with meatballs
    交叉编译lsusb
    GCC,LLVM,Clang编译器对比
    如何判断自己是否到了该辞职的时候
    Javascript Array和String的互转换。
  • 原文地址:https://www.cnblogs.com/Gredae/p/11420367.html
Copyright © 2011-2022 走看看