面向对象-继承,顺序查找,派生,子类访问父类,菱形继承
Posted gengbinjia
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象-继承,顺序查找,派生,子类访问父类,菱形继承相关的知识,希望对你有一定的参考价值。
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()
没有继承关系的时候
对象->类中
存在继承关系后 : 对象-> 自身的类中->父类 父类的父类....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()
默认情况下 是按照继承顺序来访问属性
经典类和新式类 在访问顺序上有所不同
经典类 按照深度优先的顺序
新式类 也按照深度优先 遇到公共父类 则找另一条继承关系 最后才找公共父类
菱形继承说的是一个类有多个父类 并且多个父类之间有公共父类
以上是关于面向对象-继承,顺序查找,派生,子类访问父类,菱形继承的主要内容,如果未能解决你的问题,请参考以下文章