面向对象(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“的关系 泛化: 把子类里的共性抽取到父类里的来的过程 特化: ...
随机推荐
- SSD总结
SSD: Single Shot MultiBox Detector 1. Introduction 改进点: 以前的方法都是先搞bounding box,再对box里面做分类.特点:精度高,速度慢. ...
- 公钥加密-DES-RSA
公理 双方使用同一规则加密---------密钥(对称加密算法DES)data encryption standard 最大问题 双方一起制定--------办法:密钥交换算法,不用直接传递密钥--- ...
- 19 个让 MySQL 效率提高 3 倍的 SQL 优化技巧
优化成本: 硬件>系统配置>数据库表结构>SQL及索引 优化效果: 硬件<系统配置<数据库表结构<SQL及索引 本文我们就来谈谈 MySQL 中常用的 SQL 优化 ...
- selenium3关于ddt驱动之读取json文件。。。
from selenium import webdriver import ddt import time import unittest """ DDT(驱动.json ...
- VS.2017下载安装_ZC
ZC:20190623 1.我现在下载的是 社区版 C++的桌面开发 和 C#的开发,下载 文件压缩为:移动硬盘“H:\ZC_IDE\VC\vs2017_cs_cpp(community).rar” ...
- 一个基于Unix套接字的注册登录系统
2016/5/5 今天,我参考<Unix网络编程-卷1>第5章的TCP回射客户/服务器程序写了一个简单的注册登录系统,其功能如下:(1)注册.客户端向服务器发送个人信息请求注册,服务器查询 ...
- The Maze II
There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolli ...
- mysql导入数据报错:Incorrect datetime value
incorrect datetime value 报错信息如下图: 意思很明显是说,'0000-00-00 00:00:00'不是一个有效的日期类型的值 解决办法: sql_mode 中删除 NO_Z ...
- Oracle的查询-分页查询
--Oracle中的分页 --rownum行号:当我们做select操作时候 --每查询出一行记录,就在该行加上一个行号 --行号从1开始,一次递增,不能跳着走 ----emp表工资倒叙排列后,每页5 ...
- HTTPS 简单学习
1. HTTP缺点 使用明文通信,内容可能会被窃听: 通信加密:使用SSL和TLS: 内容加密: 不验证通信方的身份,因此可能会遭到伪装: SSL提供加密和证书: 无法证明报文的完整性,因此会遭到修改 ...