类的继承

  • 继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类
  • 继承的特性是:子类会遗传父类的属性
  • 继承是类与类之间的关系

为什么用继承

  • 使用继承可以减少代码的冗余

对象的继承

  • python中支持一个类同时继承多个父类
class Parent1:passclass Parent2:passclass Sub1(Parent1,Parent2)pass
  • 查找顺序:先自己-->类-->父类-->父类的父类
  • 缺点:当继承多个的时候,功能与功能之间会混乱,顶多继承一个

  • 属性查找连续

class Foo:def f1(self):print('Foo.f1')def f2(self):print('Foo.f2')self.f1()class Bar(Foo):def f1(self):print('Bar.f1')# 对象查找属性的顺序:对象自己-》对象的类-》父类-》父类。。。
obj = Bar()  # self是obj本身,即找到Bar的f1()
obj.f2()##打印结果
Foo.f2
Bar.f1

类的派生

  • 派生:添加新的属性的同时还有继承父类的所有东西

派生方法一:

指名道姓访问某一个类的函数:该方式与继承无关

class OldboyPeople:"""由于学生和老师都是人,因此人都有姓名、年龄、性别"""school = 'oldboy'def __init__(self, name, age, gender):self.name = nameself.age = ageself.gender = genderclass OldboyStudent(OldboyPeople):"""由于学生类没有独自的__init__()方法,因此不需要声明继承父类的__init__()方法,会自动继承"""def choose_course(self):print('%s is choosing course' % self.name)class OldboyTeacher(OldboyPeople):"""由于老师类有独自的__init__()方法,因此需要声明继承父类的__init__()"""def __init__(self, name, age, gender, level):OldboyPeople.__init__(self, name, age, gender)self.level = level  # 派生def score(self, stu_obj, num):print('%s is scoring' % self.name)stu_obj.score = numstu1 = OldboyStudent('tank', 18, 'male')
tea1 = OldboyTeacher('nick', 18, 'male', 10)print(stu1.__dict__) #{'name': 'tank', 'age': 18, 'gender': 'male'}print(tea1.__dict__) #{'name': 'nick', 'age': 18, 'gender': 'male', 'level': 10}

派生方法二

  • 严格以来继承属性查找关系
  • super()会得到一个特殊的对象,该对象就是专门用来访问父类中的属性的(按照继承的关系)
  • super().__init__(不用为self传值)
  • super的完整用法是super(自己的类名,self),在python2中需要写完整,而python3中可以简写为super()
class OldboyPeople:school = 'oldboy'def __init__(self, name, age, sex):self.name = nameself.age = ageself.sex = sexclass OldboyStudent(OldboyPeople):def __init__(self, name, age, sex, stu_id):# OldboyPeople.__init__(self,name,age,sex)# super(OldboyStudent, self).__init__(name, age, sex)super().__init__(name, age, sex)self.stu_id = stu_iddef choose_course(self):print('%s is choosing course' % self.name)stu1 = OldboyStudent('tank', 19, 'male', 1)print(stu1.__dict__) #{'name': 'tank', 'age': 19, 'sex': 'male', 'stu_id': 1}

类的组合

  • 组合就是一个类的对象具备某一个属性,该属性的值是指向另外一个类的对象

    为什么要用组合

  • 组合是用来解决类与类之间代码冗余的问题
#简单版 学生选课系统# 简单的选课系统
class People:def __init__(self, name, gender):self.name = nameself.gender = genderdef eat(self):print(f'{self.name}开始吃了')class Student(People):def __init__(self, student_id, name, gender):self.student_id = student_idsuper(Student, self).__init__(name, gender)def choose_course(self, course):  # python对象self.course = course  # 组合  # 把对象当作变量值来用,当作形参/实参/返回值。print(f'{self.name}选课{course.name}成功')class Teacher(People):def __init__(self, level, name, gender):self.level = levelsuper(Teacher, self).__init__(name, gender)def scored(self, student, course, score):print(f'老师{self.name}给{student.name}课程{course.name}打分{score}')class Course:def __init__(self, name, price):self.name = nameself.price = priceclass Admin(People):def create_course(self, name, price):course = Course(name, price)print(f'管理员{self.name}创建了课程{name}')return course# 课程
# python = Course('Python', '8888')
# linux = Course('Linux', '6666')# 学生
zhubajie = Student('01', 'zhubajie', 'male')
sunwukong = Student('02', 'sunwukong', 'male')# 老师
nick = Teacher('1', 'nick', 'male')
tank = Teacher('2', 'tank', 'female')# 管理员
egon = Admin('egon', 'male')# 业务逻辑# 1. 创建课程
python = egon.create_course('python', '8888')
print(type(python))
print(python.__dict__)
linux = egon.create_course('linux', '6666')
print(linux.__dict__)# 2. 学生选择课程
zhubajie.choose_course(python)# 3. 老师给学生打分
nick.scored(zhubajie,python,'0')

菱形继承

  • 类的分类

1.新式类

  • 继承了object的类以及该类的子类,都是新式类
  • python3中所有的类都是新式类
  1. 经典类
  • 没有继承object的类以及该类的子类,都是经典类
  • 只有python2中才有经典类

如果继承关系为菱形结构,即子类的父类最后继承了同一个类,那么属性的查找方式有两种:

  • 经典类下:深度优先
  • 新式类下:广度优先

多态与多态性

多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承)
1.序列数据类型有多种形态:字符串,列表,元组
2.动物有多种形态:人,狗,猪

# 动物有多种形态:人类、猪、狗(在定义角度)
class Animal:def run(self):  # 子类约定俗称的必须实现这个方法raise AttributeError('子类必须实现这个方法')class People(Animal):def run(self):print('人正在走')class Pig(Animal):def run(self):print('pig is walking')class Dog(Animal):def run(self):print('dog is running')peo1 = People()
pig1 = Pig()
d1 = Dog()peo1.run()
pig1.run()
d1.run()#打印结果
人正在走
pig is walking
dog is running#--------------------------------------------------------
import abc
class Animal(metaclass=abc.ABCMeta):  # 同一类事物:动物@abc.abstractmethod  # 上述代码子类是约定俗称的实现这个方法,加上@abc.abstractmethod装饰器后严格控制子类必须实现这个方法def talk(self):raise AttributeError('子类必须实现这个方法')class People(Animal):  # 动物的形态之一:人def talk(self):print('say hello')class Dog(Animal):  # 动物的形态之二:狗def talk(self):print('say wangwang')class Pig(Animal):  # 动物的形态之三:猪def talk(self):print('say aoao')peo2 = People()
pig2 = Pig()
d2 = Dog()peo2.talk()
pig2.talk()
d2.talk()#打印结果
say hello
say aoao
say wangwang

多态性

注意:多态与多态性是两种概念
多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。

# 多态性:一种调用方式,不同的执行效果(多态性)
def func(obj):obj.run()func(peo1)
func(pig1)
func(d1)#打印结果
人正在走
pig is walking
dog is running
#------------------------------------------
# 多态性依赖于:继承
# 多态性:定义统一的接口
def func(obj):  # obj这个参数没有类型限制,可以传入不同类型的值obj.talk()  # 调用的逻辑都一样,执行的结果却不一样func(peo2)
func(pig2)
func(d2)#打印结果
say hello
say aoao
say wangwang#---------------------------------------

多态的好处

1.增加了程序的灵活性:以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)
2.增加了程序的可扩展性:通过继承Animal类创建了一个新的类,使用者无需更改自己的代码还是用func(animal)去调用

class Cat(Animal):  # 属于动物的另外一种形态:猫def talk(self):print('say miao')def func(animal):  # 对于使用者来说,自己的代码根本无需改动animal.talk()cat1 = Cat()  # 实例出一只猫
func(cat1)  # 甚至连调用方式也无需改变,就能调用猫的talk功能#打印结果
say miao

小结

多态:同一种事物的多种形态,动物分为人类,猪类(在定义角度)
多态性:一种调用方式,不同的执行效果(多态性)

转载于:https://www.cnblogs.com/bladecheng/p/11052172.html

类的继承,派生,组合,菱形继承,多态与多态性相关推荐

  1. c/c++入门教程 - 2.4.6 继承、公共继承、保护继承、私有继承、virtual虚继承(概念、语法、方式、构造和析构顺序、同名成员处理、继承同名静态成员处理、多继承语法、菱形继承、钻石继承)

    目录 4.6 继承 4.6.1 继承的基本语法 4.6.2 继承方式 4.6.3 继承中的对象模型 4.6.4 继承中构造和析构顺序 4.6.5 继承同名成员处理方式 4.6.6 继承同名静态成员处理 ...

  2. 虚继承:解决菱形继承问题

    文章目录 一.菱形继承 二.菱形继承问题 三.虚继承:解决菱形继承问题 ```羊驼类继承的实际是两个虚基类指针 vbptr (virtual base pointer),``` 四.虚继承代码 一.菱 ...

  3. python中组合与继承的区别_python类与对象的组合与继承

    1.把类的对象实例化放到一个新的类里面叫做类的组合,组合就是指几个横向关系的类放在一起,纵向关系的类放在一起是继承,根据实际应用场景确定.简单的说,组合用于"有一个"的场景中,继承 ...

  4. 多继承 , 组合 , 菱形继承 , 接口 , 抽象 , 鸭子类型

    一, 复习 属性的的正确存放位置:类中应该存储所有对象公共的内容对象中存储都是每个对象独有的(都不同) 初始化函数:给对象的属性赋初值 , 可以保证只要对象被创建就一定有相应的属性节省了重复代码绑定方 ...

  5. python 类组合_python类与对象的组合与继承

    1.把类的对象实例化放到一个新的类里面叫做类的组合,组合就是指几个横向关系的类放在一起,纵向关系的类放在一起是继承,根据实际应用场景确定.简单的说,组合用于"有一个"的场景中,继承 ...

  6. python 类继承和组合_python类与对象的组合与继承

    1.把类的对象实例化放到一个新的类里面叫做类的组合,组合就是指几个横向关系的类放在一起,纵向关系的类放在一起是继承,根据实际应用场景确定.简单的说,组合用于"有一个"的场景中,继承 ...

  7. python组合和继承的区别_Python开发之面向对象、类和对象、组合与继承的实例讲解...

    一.面向对象 如何创建一个类 class Xxxx: dic={xxx:xxx,xx:xx,x:x} #属性 def __init__(self,xxx,xxx,xxx): # 定义属性 def ac ...

  8. c++中的继承--3(多继承问题,菱形继承)

    继承中的多继承 #include<iostream>using namespace std;class Base1 { public:Base1(){m_A = 10;} public:i ...

  9. 【学习点滴】c++类中虚表的内存分配,菱形继承

    目录 虚函数表 早期实验 2019.9.3又做了一次: 总结: 重载.继承.隐藏 一点实验 遇到了c++钻石继承(菱形继承)的问题,看看类继承中的内存分布情况吧,有助于理解 https://www.j ...

最新文章

  1. linux c 环境变量函数 getenv putenv 简介
  2. 企业官网建设注重这四点错不了!
  3. php对象怎么拆分字符串数组,在PHP中将字符串拆分为Unicode字符数组的最佳方法是什么?...
  4. pythondistutils安装_python – 与distutils / pip一起安装Bash完成
  5. Sphinx语音识别学习记录 (五)-错误调试
  6. Day38 python基础--并发编程基础-IO模型
  7. Jsonp调用网易云音乐API搜索播放歌曲
  8. 记录手机连接笔记本热点无法上网问题
  9. ObjectMapper忽略多余字段
  10. 计算方法-常微分方程初值问题的数值解法
  11. 用js代码简单的介绍自己
  12. 【Codeforces Round #614(div2)】E-Xenon's Attack on the Gangs(树形dp)
  13. Mac电脑使用:下载安装SourceTree的步骤以及使用方法
  14. r320使用ahci模式安装linux,如何开启ahci模式 ahci模式开启的方法
  15. Yuma格式历书的总结
  16. sql语句和动态sql语句
  17. JAVA开发(H5商城嵌套到第三方H5商城进行异业合作方案)
  18. 306医院新一代移动护理系统设计与实现
  19. unity从场景中导出单个模型
  20. 华为/思科/华三基本命令对比

热门文章

  1. android tv的冷启动,YunOS for TV发布 10秒极速冷启动开机
  2. JQuery移除样式
  3. 用计算机如何编辑文档,职称计算机Dreamwaver使用教程:文本的插入与编辑
  4. 店铺淘客还能做吗?新手该如何精细化去运营店铺?如何避免违规扣分
  5. 用python实现语音的分割并保存为.wav文件
  6. 关于微信小程序你所需要掌握的技能
  7. C++ 重载运算符和重载函数
  8. postman上传文件(multipart/form-data请求)
  9. node-little-db小型本地json文件数据库
  10. 打车小秘推会员专享服务特权,或为盈利模式“试水”