第十三讲 面向对象(下)——Seasons in the sun
第十三讲目录
- 1. property装饰器
- 2. 继承简介
- 3. 方法重写
- 4. super()
- 5. 多重继承
- 6. 多态
- 7. 属性和方法
1. property装饰器
- 我们可以使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改
- 案例
class Person():def __init__(self, name):self._name = name# getter方法@propertydef name(self):print('get方法执行了')return self._name#setter方法@name.setterdef name(self, name):self._name = namep = Person('默默')
print(p.name)
p.name = '旺仔'
print(p.name)
- 运行结果
2. 继承简介
- 继承是面向对象三大特性之一
- 通过继承我们可以使一个类获取到其他类中的属性和方法
- 在定义类时,可以在类名后面的括号中指定当前类的父类(超类、基类)
- 继承提高了类的复用性。让类与类之间产生了关系。有了这个关系,才有了多态的特性
- 案例
class Animal(object):def sleep(self):print('动物会睡觉')def run(self):print('动物会跑')class Dog(Animal): # 括号里的类就是当前类的父类(超类,基类)def run(self):print('狗会跑')dog = Dog()
dog.run()# issubclass 检测一个类是否是一个类的父类
print(issubclass(Dog, Animal))
print(issubclass(Dog, object))# 任何类的最大的父类就是object类
print(issubclass(Animal, object))
- 运行结果
3. 方法重写
- 如果在子类中有和父类同名的方法,则通过子类实例去调用方法时,会调用子类的方法而不是父类的方法,这个特点我们称之为方法的重写(覆盖)
- 当我们调用一个对象的方法时:
- 会优先去当前对象中寻找是否具有该方法,如果有则直接调用
- 如果没有,则去当前对象的父类中寻找,如果父类中有则直接调用父类中的方法
- 如果没有,则去父类中的父类寻找,以此类推,直到找到object,如果依然没有找到就报错了
4. super()
- super()可以获取当前类的父类
- 并且通过super()返回对象调用父类方法时,不需要传递self
5. 多重继承
- 在Python中是支持多重继承的。也就是我们可以为一个类同时制定多个父类
- 可以在类名的()后边添加多个类,来实现多重继承
- 多重继承,会使子类同时拥有多个父类,并且会获取到所有父类中的方法
- 在开发中没有特殊情况,应该尽量避免使用多重继承。因为多重继承会让我们的代码更加复杂
- 如果多个父类中有同名的方法,则会先在第一个父类中寻找,然后找第二个,找第三个…前面会覆盖后面的
- 案例
class A(object):def text(self):print('A')class B(object):def text(self):print('B')def text2(self):print('text2')class C(A, B):passc = C()
c.text()
c.text2()print(C.__bases__)
- 运行结果
6. 多态
- 多态是面向对象的三大特性之一。从字面理解就是多种形态
- 一个对象可以以不同形态去呈现
- 面向对象三大特性
- 封装 确保对象中数据的安全
- 继承 保证了对象的扩展性
- 多态 保证了程序的灵活性
- Python中多态的特点
- 1、只关心对象的实例方法是否同名,不关心对象所属的类型;
- 2、对象所属的类之间,继承关系可有可无;
- 3、多态的好处可以增加代码的外部调用灵活度,让代码更加通用,兼容性比较强;
- 4、多态是调用方法的技巧,不会影响到类的内部设计。
class A(object):def __init__(self, name):self._name = name@propertydef name(self):return self._name@name.setterdef name(self, name):self._name = nameclass B(object):def __init__(self, name):self._name = name@propertydef name(self):return self._name@name.setterdef name(self, name):self._name = namea = A('默默')
b = B('黄浩')def speak(obj):print('好好复习呀 % s' % obj.name)speak(a)
speak(b)
- 运行结果
7. 属性和方法
- 属性
- 类属性,直接在类中定义的属性是类属性
- 类属性可以通过类或类的实例访问到。但是类属性只能通过类对象来修改,无法通过实例对象修改
- 实例属性 通过实例对象添加的属性属于实例属性
- 实例属性只能通过实例对象来访问和修改,类对象无法访问修改
- 方法
- 在类中定义,以self为第一个参数的方法都是实例方法
- 实例方法在调用时,Python会将调用对象以self传入
- 实例方法可以通过类实例和类去调用
- 当通过实例调用时,会自动将当前调用对象作为self传入
- 当通过类调用时,不会自动传递self,我们必须手动传递self
- 类方法 在类的内容以@classmethod 来修饰的方法属性类方法
- 类方法第一个参数是cls 也会自动被传递。cls就是当前的类对象
- 类方法和实例方法的区别,实例方法的第一个参数是self,类方法的第一个参数是cls
- 类方法可以通过类去调用,也可以通过实例调用
- 静态方法
- 在类中用@staticmethod来修饰的方法属于静态方法
- 静态方法不需要指定任何的默认参数,静态方法可以通过类和实例调用
- 静态方法,基本上是一个和当前类无关的方法,它只是一个保存到当前类中的函数
- 静态方法一般都是些工具方法,和当前类无关
- 案例
class A(object):# 类属性 直接定义在类中的属性# 类属性可以通过类和该类的实例来访问# 类属性只能通过类对象(A)来修改,无法通过实例对象来修改# num = 0def __init__(self, num):self.num = numdef text(self):print('text实例方法')@classmethoddef text1(cls):print('这是text1类方法')@staticmethoddef text2():print('这是text2静态方法')a = A(10)
# 实例属性 只能通过实例对象访问,无法通过类对象来访问
# 实例属性的创建:通过实例对象点上属性名来创建 a.num = 10print(a.num)# 实例方法
a.text()
A.text(a)# 类方法
# 类方法可以通过类对象调用也可以通过实例对象调用
# cls是第一个参数,也是当前的类对象
a.text1()
A.text1()# 总结:类当中所拥有的的一切,实例对象都是可以使用的# 静态方法 在类中用@staticmethod装饰的就是静态方法
# 静态方法和这个类没有关系,不需要指定任何参数,实例对象和类对象都是可以直接调用静态方法,静态方法就相当于一个功能函数,只是存放在了类中而已
a.text2()
A.text2()
- 运行结果
第十三讲 面向对象(下)——Seasons in the sun相关推荐
- Java学习系列(十)Java面向对象之I/O流(上)
IO流 我们知道应用程序运行时数据是保存在内存中的,但由于内存中的数据不可持久保存(如断电或程序退出时数据会丢失),因此需要一种手段将数据写入硬盘或读入内存.面向IO流编程就是一种很好的选择.IO:I ...
- 第十篇 面向对象的程序设计
第十篇 面向对象的程序设计 阅读目录 一 面向对象的程序设计的由来 二 什么是面向对象的程序设计及为什么要有它 三 类和对象 3.1 什么是对象,什么是类 3.2 类相关知识 3.3 对象相关知识 3 ...
- 开环直流电机的机械特性_第二十三讲 20直流PWM变换器-电动机系统及开环调速系统机械特性.ppt...
第二十三讲 20直流PWM变换器-电动机系统及开环调速系统机械特性 谢谢! 本讲结束 * * 电力传动控制系统 上海开放大学 * 第二十三讲 直流PWM变换器-电动机系统及开环调速系统机械特性 * 不 ...
- 视觉 SLAM 十四讲 —— 第十三讲 建图
视觉 SLAM 十四讲 -- 第十三讲 建图 在前端和后端中,我们重点关注同时估计相机运动轨迹与特征点空间位置的问题.然而,在实际使用 SLAM 时,除了对相机本体进行定位之外,还存在许多其他的需求. ...
- 第五十三讲 获取设备树属性
第五十三讲 获取设备树属性 文章目录 第五十三讲 获取设备树属性 一.获取设备树属性信息 1.查看属性所在节点 device_node 结构体 2.如何查找结点 节点路径 节点类型(不推荐使用) 节点 ...
- 织梦仿站系列教程第二十三讲——列表页制作(二)
织梦后台提示用户名不存在 查看数据库用户名被改为spider 织梦仿站系列教程第二十三讲--列表页制作(二) 这一讲,我们讲下列表页的分页代码,先找到如下代码: 865 1 href="ht ...
- 20165204 第十周课下作业补做
20165204 第十周课下测试补做 课上测试内容补做 测试2 针对下面的Student类,使用Comparator编程完成以下功能: 在测试类StudentTest中新建学生列表,包括自己和学号前后 ...
- 趣谈网络协议笔记-二(第十三讲)
趣谈网络协议笔记-二(第十三讲) 套接字Socket:Talk is cheap, show me the code 前言 这只是笔记,是为了整理刘超大神的极客时间专栏的只是而存在的! 经常会在网络上 ...
- 20165301第十周课下补做
第十周课下补做 知识点总结 创建一个空的链表 List<Student> list = new LinkedList<Student>(); 向链表中添加新的结点 list.a ...
最新文章
- 福布斯:混合现实未来的八大应用场景
- AI造假 vs AI打假 终结“猫鼠游戏”不能只靠技术
- 目标检测 RCNN算法详解
- awk 内嵌正则 提取字符串_干货-Shell编程文本处理三剑客之-awk
- harmonyos2.0如何申请,华为鸿蒙HarmonyOS2.0手机开发者Beta版公测申请地址方法_专题_53货源网...
- JPA 系列教程3-单向多对一
- DAVINCI开发原理之三----达芬奇编解码引擎Codec Engine(CE)
- (二十七)【2021 WWW】Learning Intents behind Interactions with Knowledge Graph for Recommendation
- linux 下的sar工具命令小结
- Ubuntu 修改主机名
- 苹果蓝牙连接不上是什么原因_为什么无线鼠标几乎都不用蓝牙连接呢?延迟、回报率是硬伤...
- 最常用的GitHub—— Android 开源项目整理(精品)
- 电力行业安全建设方案
- SDOI2015寻宝游戏
- 如何绘画Q版古风人物,超简单超实用,一学就会!
- c语言如何编写对数程序,在C语言中使用对数函数的方法
- Poco脚本的点击位置与点击偏移
- 屏幕尺寸、分辨率、视口笔记
- mysql 字段中有括号的查询方法
- HAL库实践记录之串口接收不定长数据
热门文章
- 驰骋BPM系统-表单引擎-流程引擎2020年大换装
- 定时器中断控制LED闪烁(每隔1s)---普中科技开发仪
- 后台缓存收回进程无法释放上下文[/BUSINESS的缓存的[10]%-请考虑增加缓存的最大大小
- 互联网晚报 | 12月20日 星期一 | 安踏100亿成立“和敏基金会”;阿里公布碳中和目标;京东上线数字藏品交易平台...
- SAP成都研究院的体育故事
- 放大招了,肝了一篇8万字的Java8新特性总结,赶快收藏
- string类型--字符串常用取值操作
- 分省市县地理空间矩阵:地级市空间、地理距离矩阵等多指标数据集
- 阿里大促,「技术负责人」如何做技术保障?
- 入门PCB设计-DY工作室