zoukankan      html  css  js  c++  java
  • 继承

    1,什么是继承

        继承是一种新建类的方式,在python中支持多继承

        新建的类称为子类或者派生类,被继承的父类也可以称为基类或超类,子类会继承父类的属性

    2,为什么要用继承

        减少代码冗余

    3,怎么用继承

      在定义类的时候,在括号内加上类名,括号内的类就是父类,定义的类就是子类

    class ParentClass1:
        pass
    class ParentClass2:
        pass
    
    class Subclass1(ParentClass1):
        pass
    
    class Subclass2(ParentClass1,ParentClass2,):
        pass
    
    #使用__bases__来查看子类继承的父类
    print(Subclass2.__bases__
    继承的使用

    4,继承关系

      继承是类和类之间的关系,寻找这种关系需要先抽象在继承

      继承:是基于抽象的结果。通过编程语言去实现继承,肯定是先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构

    5基于单继承的属性查找

      当子类只继承一个父类的属性时,

      属性的查找顺序为:::对象自己的名称空间-----子类的名称空间----父类的名称空间

      

    class Foo:
        def f1(self):
            print('Foo.f1')
    
    def f2(self): #self=obj
          print('Foo.f2')
          self.f1() #obj.f1()
    
    class Bar(Foo):
        def f1(self):
            print('Bar.f1')
    
    obj=Bar()
    # print(obj.__dict__) #查看名称空间
    obj.f2()
    单继承的属性查找

    6,派生:子类定义自己的新的属性,如果属性名与父类同名,就以子类自己的为准

        定义这个新属性的过程就是派生

     

     class OldboyPeople:
         school = 'oldboy'
    
         def __init__(self, name, age, sex):
             self.age = age
             self.name = name
             self.sex = sex
    
         def f1(self):
             print('爹的f1')
    class OldboyTeacher(OldboyPeople):
         def change_score(self):
            print('teacher %s is changing score' %self.name)
    
        def f1(self):
           print('儿子的f1')
    
     tea1 = OldboyTeacher('egon', 18, 'male')
     tea1.f1()    
    派生

    7,在子类派生出的新属性中重用父类的功能

      1,指名道姓的调用(与继承没有关系)

        方法:在派生的定义过程中,直接使用父类名 . 属性名去调用父类的功能

      

    class OldboyPeople:
        school = 'oldboy'
    
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
    
        def f1(self):
            print('爹的f1')
    class OldboyTeacher(OldboyPeople):
        def change_score(self):
            print('teacher %s is changing score' %self.name)
    
        def f1(self):
            print('儿子的f1')
    
    tea1 = OldboyTeacher('egon', 18, 'male')
    tea1.f1()
    指名道姓调用父类功能

      2,super() 调用(严格依赖继承)

      #super()的返回值是一个特殊的对象。这个对象专门用来调用父类的属性

      注意:python2中,  调用格式:super(自己的类名,self)

    class OldboyPeople:
        school = 'oldboy'
    
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
    
        def tell_info(self):
            print("""
            ===========个人信息==========
            姓名:%s
            年龄:%s
            性别:%s
            """ %(self.name,self.age,self.sex))
    
    
    class OldboyTeacher(OldboyPeople):
    
        def __init__(self, name, age, sex, level, salary):
            super().__init__(name,age,sex)
            self.level = level
            self.salary = salary
    
        def tell_info(self):
            super().tell_info()
            print("""
            等级:%s
            薪资:%s
            """ %(self.level,self.salary))
    
    tea1 = OldboyTeacher('egon', 18, 'male', 9, 3.1)
    tea1.tell_info()
    super()调用父类功能

    8,新式类和经典类

       新式类:继承object的类,以及该类的子类,都是新式类

          在python3中,如果一个类没有指定继承的父类,默认就继承object,

            所以python3中所有的类都是新式类

       经典类:(只有在python2才区分经典类和新式类)

           没有继承object的类,以及该类的子类,都是经典类

    9,多继承背景下的属性查找

      1,在非菱形结构的情况下,按照继承的先后顺序,一个分支一个分支的查处,查找完一个分支再找下一个分支,直到结束

      2,菱形结构结构时,分一下两个情况

        经典类:深度优先

        新式类:广度优先

      

    10,super()严格依赖继承------会严格按照mro列表从当前查到的位置继续往后查找

    class A:
        def test(self):
            print('A.test')
            super().f1()
    class B:
        def f1(self):
            print('from B')
    class C(A,B):
        pass
    
    c=C()
    print(C.mro()) #C->A->B->object
    
    
    c.test()
    suoer()严格依赖继承

    11.关于__init__方法

      强调:方法内可以任意的python代码

          一定不能有返回值

  • 相关阅读:
    中文编码问题
    TCP网络参数优化
    I/O的整体介绍
    TCP/IP
    Java序列化技术
    WEB请求过程(http解析,浏览器缓存机制,域名解析,cdn分发)
    λ(lambda)表达式
    HeapByteBuffer和DirectByteBuffer以及回收DirectByteBuffer
    锁的优化和注意事项
    java的NIO和AIO
  • 原文地址:https://www.cnblogs.com/guodengjian/p/8807834.html
Copyright © 2011-2022 走看看