zoukankan      html  css  js  c++  java
  • 面向对象(OPP)的三大特征之 继承

    OPP(面向对象编程的缩写)的三大优势:
    1.继承
    2.封装
    3.多态

    一.继承
    1.继承:是两个对象之间的一种关系
    a继承b 例如王思聪继承王健林
    在OPP中继承是描述类与类之间的一种关系
    2.继承的好处:可以减少代码冗余,极大地提高了代码的复用性
    在生活中,儿子继承了父亲的财产,就可以直接使用这些财产
    在程序中,一个类a 继承了b,那么a就可以直接使用b类中的特征(变量)和功能(函数).
    名词解释: a继承b,a称之为子类(派生类),b称之为父类(基类)

    注意:继承描述的是 什么是什么的关系 人是动物
    在使用继承时 要信分析 类与类之间的关系 不应该违反显示生活中的原则


    例一
    class Tecahter:
    school = 'oldboy'

    def __init__(self,name,age,gender):
    self.name = name
    self.age = age
    self.gender = gender

    def tecahing(self):
    print('%s is teaching' % self.name)

    class Student():
    school = 'oldboy'

    def __init__(self,name,age,gender,number):
    self.name = name # 此时,很明显下面的有很多代码出现了重复,为降低代码冗余,所以可以使用继承,如例二
    self.age = age
    self.gender = gender
    self.number = number

    def studying(self):
    print('%s is studying')

    例二 学生和老师都属于老男孩的,都有年龄和学号,但是老师有老师的技能,学生有学生自己的技能和特征
    因此,对于老师和学生都有的特征就可以使用继承来提高代码的复用性,从而减少代码冗余
    class Teacher:
    school = 'oldboy'

    def __init__(self,name,age,gender):
    self.name = name
    self.age = age
    self.gender = gender

    def tecahing(self):
    print('%s is tecahing' % self.name)

    class Student(Teacher):
    def studying(self):
    print('%s is studying' % self.name)

    t1 = Teacher('egon',67,'male')
    t1.tecahing()
    print(t1.age)
    print(t1.gender)

    stu1 = Student('deng',18,'male')
    stu1.studying()
    print(stu1.age)
    print(stu1.gender)


    二.抽象
    在使用继承之前一定要先抽象,再继承
    抽象,什么是抽象?
    抽取一堆相同的内容,形成一个新的抽象概念(其实就是类,也成为公共基类),这个过程就称之为抽象

    例如上一个例子,老男孩的老师和学生,老师有自己的特征和技能,学生也有自己的特征和技能,
    老师和学生之间有一些相同的属性和技能(例如都有姓名,性别,年龄),但是老师和学生之间有一些不同的属性和技能
    比如老师有自己的工号,而学生没有,老师有自己的独特的技能(讲课),但是学生没有,
    而学生也有自己所独有的特征和技能(例如学号,学习等)
    此时再使用继承就会有问题,学生在继承的过程中,把老师所独有的技能和特征都继承了过来,这显然是不行的

    因此,那我们就可以把这些相同的特征和技能单独拎出来,建立一个新的类,即抽象也可以称之为公共基类
    例3

    例3
    class OldboyPerson: # OldboyPerson 就是老师和学生所共同拥有的特征和技能,被单独拎出来,这就是抽象
    school = 'oldboy'

    def __init__(self,name,age,gender):
    self.name = name
    self.age = age
    self.gender = gender

    def say_hi(self):
    print('hello,i am %s' % self.name)


    class Tecaher(OldboyPerson):
    def tecahing(self):
    print('%s is tecahing' % self.name)

    class Student(OldboyPerson):
    def studying(self):
    print('%s is studying' % self.name)


    t1 = Tecaher('egon',79,'female')
    t1.tecahing()
    t1.say_hi() # 此时,egon和deng都可以使用抽象处理来的特征和技能,即公共基类

    stu1 = Student('deng',18,'man')
    stu1.studying()
    stu1.say_hi()

    三. 属性的查找顺序
    没有继承关系的时候
    对象 ---> 类
    存在继承关系后
    对象 ---> 子类本身 ---> 父类 ---> 父类的父类..........--->object

    object:
    object是所有父类的跟类,所有类都直接或间接的继承自object
    在定义类的时候 如果你没有手动继承任何类 默认继承object
    object 中包含所有对象通用的方法

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

    class Father(object):
    age = 30

    class Son(Father):
    # age = 7
    pass
    s1 = Son()
    # print(s1.__dict__)
    # s1.age = 29 # 先找对象自己的age,再往上找子类中的age,若找不到,再找父类中的age
    # print(s1.__dict__)
    print(s1.age)


    四 . 继承的另一种常用方式
    可以继承一个系统已有的类 来扩展新功能
    需求:给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)
    # print(li)

    li.append('abc')
    print(li)


    五. 派生与覆盖
    派生:
    当一个类继承另一个类,并且存在与父类不同的内容时,就称之为派生类
    通常情况下 一个子类就是派生类

    覆盖:
    在继承关系中,子类可以出现与父类完全相同的方法,根据查找方法,会优先使用子类中的方法
    这种情况称之为覆盖,如下例

    class Person:
    def __init__(self,name,age,gender):
    self.name = name
    self.age = age
    self.gender = gender

    def say_hi(self):
    print('你好,我是%s' % self.name)

    class Student(Person):
    # 会覆盖父类中的say_hi 函数
    def say_hi(self):
    print('hello my name is %s,age is %s' % (self.name,self.age))

    stu1 = Student('deng',18,'man')
    stu1.say_hi()

    六. 子类重用父类的方法
    很多情况下,我们需要在子类中访问父类的名字
    就可以用 super().要访问的名字
    class Person:
    test = '1234'

    def __init__(self,name,age,gender):
    self.name = name
    self.age = age
    self.gender = gender

    def say_hi(self):
    print(self.name,self.age,self.gender)

    class Student(Person):
    def __init__(self,name,age,gender,number):
    # self.name = name
    # self.age = age
    # self.gender = gender
    # Person.__init__(self,name,age,gender) # 子类重用父类方法的方式之一 与继承没有任何关系 指名道姓的调用
    # super(Student, self).__init__(name,sex,age) # super表示父类的意思 python2中的写法
    super().__init__(name,age,gender) # super()会调用父类中的初始化方法 最常用写法
    self.number = number
    print(super().test) # 调用父类中的属性
    def say_hi(self):
    super().say_hi()
    print(self.number)


    stu1 = Student("Egon", "woman", 100,"olboy 007")
    stu1.say_hi()
  • 相关阅读:
    Oracle中的带参数的视图--我们致力于打造人力资源软件
    (免费)在线演示人力资源管理系统--源自偕行软件
    打造国内第一个支持在线演示的人力资源管理系统--源自偕行软件
    Silverlight C1.Silverlight.FlexGrid 表格动态列
    SILVERLIGHT 多维表头、复杂表头 MULTIPLE HEADER
    weixin JS 接口调用代码
    盒布局
    焦点不在input或textarea中,屏蔽回格按钮
    CSS3多栏布局
    AJAX
  • 原文地址:https://www.cnblogs.com/dengyanchuan/p/10402185.html
Copyright © 2011-2022 走看看