• 面向对象之继承


    面向对象的继承

     

    1.什么是继承?

    继承是一种新建类的方式,新建的类称之为子类或派生类,继承的父类称之为基类或超类。

    在python中一个子类可以继承多个父类。(******

    在其他语言中,一个子类只能维持一个父类。

    2.继承作用:减少代码冗余。

    3.如何实现继承:

    1)先确认谁是子类,谁是父类。

    2)在定义子类时,子类名(父类名)

    #父类
    class Father1:
       # x = 1
       pass
    class Father2:
       # x =2
       pass
    class Father3:
       x = 3
       pass
    #子类
    class Sub(Father1,Father2,Father3):#继承方式从左到右
       y = 1
       x = 12
    print(Sub.__bases__)
    print(Sub.x)#查找顺序从自己,自己没有从父类继承

    如何寻找继承关系:

    确认谁是子类:

    如:哈士奇对象--》犬类--》动物父类

    确认谁是父类:

    动物类时父类

    先抽象后继承

    抽取对象之间相似的部分,总结出子类。

    抽取类之间相似的部分,总结出父类。

    继承出现的问题:代码冗余
    #解决代码冗余问题
    #老男孩人类
    class OldboyPeople:
       school = 'oldboy'
       country = 'China'
       def __init__(self, name, age, sex):
           self.name = name
           self.age = age
           self.sex = sex
    #老师类
    class OldboyTeacher(OldboyPeople):
       def change_score(self):
           print(f'老师{self.name}正在修改试卷。。')
    #学生类
    class OldboyStudent(OldboyPeople):
       def choose_course(self):
           print(f'学生{self.name}正在选课。。。')
    stu1 = OldboyStudent('猪猪侠', 12, 'famale')
    print(stu1.name, stu1.age, stu1.sex)
    tea1 = OldboyTeacher('迷糊老师', 26, 'famale')
    print(tea1.name, tea1.age, tea1.sex)
    在继承背景下对象属性的查找顺序

    注意:程序的执行顺序是由上到下,父类必须定义在子类的上方。

    在继承背景下对象属性的查找顺序:

    1.先从对象自己的名称空间中查找

    2.如果对象中没有,从子类的名称空间中查找

    3.如果子类中没有,从父类的名称空间中查找,若父类没有,则会报错。

    #父类
    class GOO:
       # x =10
       pass
    #子类
    class Foo(GOO):
       # x = 500
       pass
    foo_obj = Foo()
    # foo_obj.x = 1000
    print(foo_obj.x)
    print('对象的名称空间:', foo_obj.__dict__)
    print('子类的名称空间:', Foo.__dict__)
    print('父类的名称空间:', GOO.__dict__)

    派生:

    指的是子类继承父类的属性方法,并且派生出自己独有的属性与方法。

    若子类中的方法名与父类的相同,优先用子类的。

    #父类

     

    #父类
    class Foo:
       def f1(self):
           print('from Foo...')
       def f2(self):
           print('from Foo.f2...')
           self.f1()
    #子类
    class Bre(Foo):
       def f1(self):
           print('from Bar.f1...')
       def func(self):
           print(f'from Bar.func...')
    bar_obj = Bre()  #先找自己自己的没有再找父集的
    # bar_obj.f2()
    bar_obj.f1()

    子类继承父类,派生出自己的属性与方法,并且重用父类的属性方法

    解决子类重写父类的__init__导致代码更加冗余
    两种方式:
    1.直接引用父类的__init__为其传参,并添加子类的属性。
       2.通过super来指向父类的属性。
      super()是一个特殊的类,调用super得到一个对象,该对象指向父类的名称空间。
           注意:使用哪一种都可以,但不能两种方式混合使用。
    方法1:
    class OldboyPeople:
       school = 'oldboy'
       def __init__(self, name, age, sex):
           self.name = name
           self.age = age
           self.sex = sex
    class OldboyTeacher(OldboyPeople):
       def __init__(self, name, age, sex, sal):
           OldboyPeople.__init__(self, name, age, sex)
           self.sal = sal
       def change_score(self):
           print(f'老师{self.name}修改分数')
    class OldboyStudent(OldboyPeople):
       def __init__(self, name, age, sex, girl):
           OldboyPeople.__init__(self, name, age,sex)
           self.girl = girl
       def choose_course(self):
           print(f'学生{self.name}选择课程。。。')
    teal = OldboyTeacher('tank', 17, 'male', 18020)
    print(teal.name,teal.age, teal.sex, teal.sal)
    stu1 = OldboyStudent('皮卡丘',12,'male','杰尼龟')
    print(stu1.name, stu1.age, stu1.sex, stu1.girl)
    方法2:
    class OldboyPeople:
       school = 'oldboy'
       def __init__(self, name, age, sex):
           self.name = name
           self.age = age
           self.sex = sex
    class OldboyTeacher(OldboyPeople):
       def __init__(self,name,age,sex,sal):
           super().__init__(name,sex,sal)
           self.sal = sal
       def change_sorce(self):
           print(f'老师{self.name}修改分数')
    class OldboyStudent(OldboyPeople):
       def __init__(self,name,age,sex,girl):
           super().__init__(name,age,sex)
           self.girl = girl
       def choose_course(self):
           print(f'学生{self.name}选择课程。。。')
    teal = OldboyTeacher('tank', 17, 'male', 18020)
    print(teal.name,teal.age, teal.sex, teal.sal)
    stu1 = OldboyStudent('皮卡丘',12,'male','杰尼龟')

    经典类与新式类: (了解) - 工作中遇不到 - 面试有可能会问

    • 新式类:1.凡是继承object的类或子孙类都是新式类。2.在python3中所有的类都默认继承object。

    • 经典类:1.在python2中才会有经典类与新式类之分。2.在python2中,凡是没有继承object的类,都是经典类。

    多继承情况下造成 “钻石继承”

    mro的查找顺序:
      - 新式类:
          - 广度优先

      - 经典类:
          - 深度优先

    面试注意细节: - 遇到一个技术 知道是什么,但是不会用,一定要贬低这个技术,觉得很简单,让面试官误以为你很会。 - 遇到一个技术,不知道是什么,要说我见过,但是忘记怎么用了,我博客里面,回头找一下就行了。

  • 相关阅读:
    Zookeeper 基础知识【1】
    Spark 基础复习【1】
    ZooKeeper 入门 一致性
    Hive 视图 索引
    Yarn调度 历史与基础
    mysql 优化【1】
    TCP IP知识梳理
    Java 基础 锁
    Spark 累加器使用
    RATE-MAX----beta答辩博客
  • 原文地址:https://www.cnblogs.com/cyfdtz/p/11984718.html
Copyright © 2020-2023  润新知