zoukankan      html  css  js  c++  java
  • 面向对象-继承,顺序查找,派生,子类访问父类,菱形继承

    OOP的三大特征(优势)
    1.封装
    2.继承
    3.多态


    继承:是两个对象之间产生的一种关系
    a继承b
    在OOP的程序中继承是描述类与类之间的一种关系
    继承的好处:程序中 一个类a继承另一个类b a就可以使用B的属性和方法
    具体的说:继承极大的提高了代码的重用性
    继承描述的是 什么 是什么的关系
    注意:在使用集成时,要自己分析.类与类之间的关系 不应该违反显示生活中的原则
    在使用继承的时候一定是先抽象 在继承
    抽象:抽取一堆类共同拥有的内容 形成一个新的抽象的概念(也称为公共基类) 这个过程就叫做 抽象
    注意:很多情况下 抽象得到的新的类型与业务是不相关的 仅仅是因为代码需要
    # class OldBoyPerson:
    #     school='oldboy'
    #     def __init__(self,name,gender,age):
    #         self.name=name
    #         self.gender=gender
    #         self.age=age
    #
    #     def say_hi(self):
    #         print('hello my name is %s'%self.name)
    #
    # class Teacher(OldBoyPerson):
    #     def teaching(self):
    #         print('%s is teaching'%self.name)
    #
    # class Student(OldBoyPerson):
    #     def studying(self):
    #         print('%s is studying'%self.name)
    #
    # t1=Teacher('xxx','man',17)
    # t1.teaching()
    # t1.say_hi()
    #
    # stu1=Student('xxx','man',17)
    # stu1.studying()
    # stu1.say_hi()
    View Code


    没有继承关系的时候
    对象->类中
    存在继承关系后 : 对象-> 自身的类中->父类 父类的父类....object
    object 是所有类的根类 所有类都直接或间接的继承自object
    在定义类的时候 如果你没有手动继承任何类 默认继承object
    object 中包含了所有对象通用的方法

    新式类 只要是继承自object 都是新式类 在python3中所有类都是新式类
    python2中不会自动继承object 需要手动继承object 才能变成一个新式类
    新式类和经典类的区别在于继承关系中的属性的查找顺序不同

    可以继承一个系统已有的类 来扩展新功能
    需求:给list扩展类型限制的功能 只允许存储整型数据
    # class MyList(list):
    #     def append(self,object):
    #         print('append run')
    #         if type(object)==int:
    #             list.append(self,object)
    #         else:
    #             print('必须是元素!')
    # li=MyList()
    # li.append(100)
    # li.append('abc')
    # print(li)

    派生
    当一个类继承另一个类 并存在与父类不同的内容时 就称之为派生类
    通常情况下 一个子类就是一个派生类
    覆盖
    在继承关系中 子类可以出现与父类完全相同的方法 根据查找顺序 会优先使用子类中的方法 这种情况称之为覆盖

    很多情况下我们需要在子类中来访问父类中的内容
    就可以通过super().要访问的名字
    # class Person:
    #     test='12345'
    #     def __init__(self,name,sex,age):
    #         self.name = name
    #         self.sex=sex
    #         self.age=age
    #     def say_hi(self):
    #         print(self.name,self.sex,self.age)
    #
    #
    # class Student(Person):
    #     def __init__(self,name,sex,age,number):
    #         # self.name = name
    #         # self.sex = sex
    #         # self.age = age
    #         # Person.__init__(self,name,sex,age)
    #         # super(Student, self).__init__(name,sex,age)
    #         super().__init__(name,sex,age)
    #         self.number=number
    #
    #
    #     def say_hi(self):
    #         super().say_hi()
    #         print(self.number)
    #         print(super().test)
    #
    # stu1=Student('xxx','man',100,'9527')
    # stu1.say_hi()
    覆盖

    组合:即把不同的对象组合到一起 也是用来减少重复代码
    一个对象可以把另一个对象作为属性来使用
    class PC:
        def __init__(self,pc_type):
            self.pc_type=pc_type
    
        def working(self):
            print('%s 计算机正在计算'%self.pc_type)
    
    class Student():
        def __init__(self,name,pc):
            self.name=name
            self.pc=pc
    
        def studying(self):
            self.pc.working()
            print('%s 使用%s 电脑在听课'%(self.name,self.pc.pc_type))
    pc1=PC('联想')
    stu1=Student('张三丰',pc1)
    stu1.studying()

    python支持多继承
    一个类可以同时继承多个其他类
    好处:可以同时拥有多个类中已存在的内容
    坏处:如果父类中出现了重复的名字 执行顺序需要参考mro列表
    查看mro列表 类名.mro()
    默认情况下 是按照继承顺序来访问属性

    经典类和新式类 在访问顺序上有所不同
    经典类 按照深度优先的顺序
    新式类 也按照深度优先 遇到公共父类 则找另一条继承关系 最后才找公共父类

    菱形继承说的是一个类有多个父类 并且多个父类之间有公共父类
  • 相关阅读:
    【梦断代码】与我们队的相似之处
    梦断代码 之 你失败过吗
    梦断代码 之 程序人生
    C#中父类转换为子类
    C#中Dictionary泛型集合7种常见的用法
    Linux 常见命令 目录处理指令
    使用XSLT+XML生成网页
    我心目中的Asp.net核心对象
    配色速成
    VS.NET中JavaScript隐藏特性
  • 原文地址:https://www.cnblogs.com/gengbinjia/p/10400995.html
Copyright © 2011-2022 走看看