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)的三大特征之 继承的更多相关文章

  1. Python面向对象初始(三大特征,多态,继承,封装)

    Python面向对象的初始 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的 ...

  2. Java的OOP三大特征之一——继承

    Java的OOP三大特征之一——继承 子类继承父类的特征和行为(属性和方法),使得子类具有父类的各种属性和方法.或子类从父类继承方法,使得子类具有父类相同的行为. 特点:在继承关系中,父类更通用.子类 ...

  3. Python学习day24-面向对象的三大特征之继承

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  4. JAVA的三大特征 封装继承多态- 简单总结

    简单总结一下 封装-即从很多类的抽取相同的代码 写在一个类里. 好处是 代码的重用,安全. 继承-减少代码的书写. 其好处也是 代码的重用. 多态- 把不同的子类对象都当作父类来看,可以屏蔽不同子类对 ...

  5. Python面向对象之:三大特性:继承,封装,多态以及类的约束

    前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情 ...

  6. Java三大特征之继承(二)

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  7. PHP其它常用函数;<<<面向对象(OPP)的三大特性:封装、继承、加态:>>> <----面试题 ;构造方法、析构方法,魔术方法、set、get方法;静态;抽象类;接口

    PHP其它常用函数:     赋值:$r->name = "元素";      取值: echo $r->name;  count()   计算数组中的元素数目或对象中 ...

  8. Java面向对象概述及三大特征(封装,继承和多态)

    一.面向对象思想 Java是面向对象的高级语言,对于Java语言来说,万事万物皆对象! 它的基本思想是使用类,对象,继承,封装,消息等基本概念进行程序设计.面向对象程序的最小单元是类,类代表了客观世界 ...

  9. 面向对象三大特征之继承(extends)——Java笔记(六)

    继承:            从一般到特殊的关系,是一种拓展关系,子类对象是父类的一种,也可称为”is a“的关系 泛化:         把子类里的共性抽取到父类里的来的过程 特化:         ...

随机推荐

  1. Python常用模块安装

    1. python操作MySQL数据库的依赖包MySQLdb ImportError: No module named MySQLdb 安装方式: yum install MySQL-python 2 ...

  2. Flutter中通过循环渲染组件

    class ContactsState extends State<Contacts>{ List formList; initState() { super.initState(); f ...

  3. 【计算机视觉】深度相机(八)--OpenNI及与Kinect for windows SDK的比较

    OpenNI(开放自然交互)是一个多语言,跨平台的框架,它定义了编写应用程序,并利用其自然交互的API.OpenNI API由一组可用来编写通用自然交互应用的接口组成.OpenNI的主要目的是要形成一 ...

  4. 同一个ip,不同端口号,cookie会被覆盖

    参考资料:https://blog.csdn.net/czh500/article/details/80420459

  5. uva 1400 "Ray, Pass me the dishes!" (区间合并 最大子段和+输出左右边界)

    题目链接:https://vjudge.net/problem/UVA-1400 题意:给一串序列,求最大子段,如果有多个,输出字典序最小的那个的左右端点 思路: 之前写过类似的,这个麻烦点需要输出左 ...

  6. table固定头部,tbody内容滚动

    直觉的感受是修改thead与tbody,尝试了以下几种方法,但均告失败. 1. 将tbody设置为块状元素,然后设置表格的高度与溢出: 1. 将thead设置为绝对定位,然后设置表格的高度与溢出: 1 ...

  7. HDU 4417-Super Mario-线段树+离线

    Description Mario is world-famous plumber. His "burly" figure and amazing jumping ability ...

  8. python以不同方式打印输出九九乘法表

    参考:http://www.cnblogs.com/suiy-160428/p/5594389.htmlpython输出 9*9 乘法口诀表 矩形输出九九乘法表: for i in range(1,1 ...

  9. C++反汇编第四讲,认识多重继承,菱形继承的内存结构,以及反汇编中的表现形式.

    目录: 1.多重继承在内存中的表现形式 多重继承在汇编中的表现形式 2.菱形继承 普通的菱形继承 虚继承 汇编中的表现形式 一丶多重继承在内存中的表现形式 高级代码: class Father1 { ...

  10. poj 1006中国剩余定理模板

    中国剩余定理(CRT)的表述如下 设正整数两两互素,则同余方程组 有整数解.并且在模下的解是唯一的,解为 其中,而为模的逆元. 模板: int crt(int a[],int m[],int n) { ...