面向对象(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()
面向对象(OPP)的三大特征之 继承的更多相关文章
- Python面向对象初始(三大特征,多态,继承,封装)
Python面向对象的初始 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的 ...
- Java的OOP三大特征之一——继承
Java的OOP三大特征之一——继承 子类继承父类的特征和行为(属性和方法),使得子类具有父类的各种属性和方法.或子类从父类继承方法,使得子类具有父类相同的行为. 特点:在继承关系中,父类更通用.子类 ...
- Python学习day24-面向对象的三大特征之继承
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- JAVA的三大特征 封装继承多态- 简单总结
简单总结一下 封装-即从很多类的抽取相同的代码 写在一个类里. 好处是 代码的重用,安全. 继承-减少代码的书写. 其好处也是 代码的重用. 多态- 把不同的子类对象都当作父类来看,可以屏蔽不同子类对 ...
- Python面向对象之:三大特性:继承,封装,多态以及类的约束
前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情 ...
- Java三大特征之继承(二)
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- PHP其它常用函数;<<<面向对象(OPP)的三大特性:封装、继承、加态:>>> <----面试题 ;构造方法、析构方法,魔术方法、set、get方法;静态;抽象类;接口
PHP其它常用函数: 赋值:$r->name = "元素"; 取值: echo $r->name; count() 计算数组中的元素数目或对象中 ...
- Java面向对象概述及三大特征(封装,继承和多态)
一.面向对象思想 Java是面向对象的高级语言,对于Java语言来说,万事万物皆对象! 它的基本思想是使用类,对象,继承,封装,消息等基本概念进行程序设计.面向对象程序的最小单元是类,类代表了客观世界 ...
- 面向对象三大特征之继承(extends)——Java笔记(六)
继承: 从一般到特殊的关系,是一种拓展关系,子类对象是父类的一种,也可称为”is a“的关系 泛化: 把子类里的共性抽取到父类里的来的过程 特化: ...
随机推荐
- RocketMQ采坑记
先来一篇解释比较多的实例 https://www.cnblogs.com/super-d2/p/4154541.html No route info of this topic, PushTopic ...
- WPS--world使用格式刷
1.在空白处左键点击一下即可出现格式刷
- PyToune:一款类Keras的PyTorch框架
PyToune is a Keras-like framework for PyTorch and handles much of the boilerplating code needed to t ...
- Python扫描器-爬虫基础
0x1.基础框架原理 1.1.爬虫基础 爬虫程序主要原理就是模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放于数据库或文件中 1.1.基础原理 1.发起HTTP请求 2 ...
- C#中设置自定义控件工具箱图标
在设计自定义控件时,系统默认生成的图标比较单一难看,如何为控件设计自己的图标呢,这里给出了一种基于ToolBoxBitmap 属性设置自定义控件工具箱图标的方法. 1)首先将图标文件名改为自定义控件名 ...
- ip routing 开启三层路由模式
no ip router是关闭路由协议,no ip routing 是关闭三层的路由工作模式 no ip route是删除某条(静态)路由,比如no ip router 0.0.0.0 0.0.0.0 ...
- nload 安装和使用
nload是一个很小巧的工具,用来监控当前系统的网速 安装 MAC brew install nload Linux 下载地址:https://sourceforge.net/projects/nlo ...
- prometheus 监控 redis + rabbitmq
1.安装部署 1.1 wget https://github.com/oliver006/redis_exporter/releases/download/v0.15.0/redis_exporter ...
- 监听input框变化,即时搜索 compositionstart, compositionend
前话: 如果直接通过input监听, 它是键盘输入按键按下了就触发时间,这样可能导致一些问题,比如在谷歌浏览器想输入中文输入不了: 解决方案: 用 compositionstart 和 composi ...
- list集合的一些小见解
关于LIst集合 前言: 第一次写博客,有些东西可能总结的到位,发表一下自己的一些观点,欢迎大佬们点评和指教 正文: list集合可以分为ArrayLlst和LinkedList. ArrayList ...