面向对象(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“的关系 泛化: 把子类里的共性抽取到父类里的来的过程 特化: ...
随机推荐
- 五指MUD协议
//MUD转义协议 #ifndef __WZMUD__ #define __WZMUD__ #define WZKEY "ZWUxMTIyMDAwMw==" #define ESA ...
- Android view的一些认识
转载:9102年末,我对Android view的13条认识: (顺手留下GitHub链接,需要获取相关面试等内容的可以自己去找)https://github.com/xiangjiana/Andro ...
- redis常用命令及操作
说明 连接哨兵模式的redis时,我们连接的哨兵进程的ip和端口,这时很多命令不可用:此时,需要直接连接redis真实的服务器ip和端口:Sentinel模式下,连接真实的ip才可以使用config/ ...
- pip安装pillow——死循环:[WinError5] & [TypeError:'module' object is not callable]
1.这次本来要安装个pillow,记得以前装了的,怎么这次就不行了.然后,下意识的使用:pip3 install pillow. 发现报错: [TypeError:'module' object is ...
- java-对象的区别
1.JavaBean 是一种JAVA语言写成的可重用组件.为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器.JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员 ...
- WPScan使用完整攻略:如何对WordPress站点进行安全测试
转载自FreeBuf.COM 严正声明:本文仅限于技术探讨,严禁用于其他目的. 写在前面的话 在这篇文章中,我将告诉大家如何使用WPScan来对WordPress站点进行安全测试. WPScan是Ka ...
- 《精通并发与Netty》学习笔记(10 - 详解NIO (一) Channel、Buffer )
一.Java NIO 概述 Java NIO 由以下几个核心部分组成:ChannelsBuffersSelectors虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Bu ...
- 你除了在客户端上会使用Cookie,还能使用哪些可以作为数据缓存呢?
问题如标题,直奔主题.介绍下另两种缓存. 1.sessionStorage.localStorage localStorage: 是一种你不主动清除它,它会一直将存储数据存储在客户端的存储方式,即使你 ...
- sklearn数据集
数据集划分: 机器学习一般的数据集会划分为两个部分 训练数据: 用于训练,构建模型 测试数据: 在模型检验时使用,用于评估模型是否有效 sklearn数据集划分API: 代码示例文末! scikit- ...
- Java手写简单Linkedlist一(包括增加,插入,查找,toString,remove功能)
@Java300 学习总结 一.自定义节点 LinkList底层为双向链表.特点为查询效率低,但增删效率高,线程不安全. 链表数据储存在节点,且每个节点有指向上个和下个节点的指针. 创建ggLinke ...