python第十四课 面向对象(三)
文章目录
- 一、继承的简介
- 二、方法的重写
- 三、super()
- 四、多重继承
- 五、多态
- 六 类中的属性和方法
- 类属性
- 实例属性
- 实例方法
- 类方法
- 静态方法
一、继承的简介
1.提高了代码的复用性
2.让类与类之间产生了关系,有了这个关系,才有了多态
继承是面向对象的三大特性之一
如建立如下的class:
class Person():name = ''age = ''class Doctor():name = ''age = ''def study(self):print('治疗病人')class Soldier():name = ''age = ''def study(self):print('保卫国家')
在上述代码中,person、docter、soldier都具有相同的属性name、age但是在定义的时候每一个都重新定义了一次这样显得代码冗长,且复用性差,所以可以采用继承的方式来进行代码优化。
在定义类时,可以在类名后面加上括号,括号内中指定的是当前类的父类(超类、基类、super)
class Person:def __init__(self,name,age):self.name = nameself.age = ageclass Docter(Person):def study(self):print(f'{self.name}是医生,他的职责是治疗病人')class Soldier(Person):def study(self):print(f'{self.name}是军人,他的职责是保卫国家')
调用上述代码:
p1 = Docter('张三', 23)
p1.study()
p2 = Soldier('李四', 22)
p2.study()
>>> 张三是医生,他的职责是治疗病人
>>> 李四是军人,他的职责是保卫国家
如果在创建类的时候省略了父类,则默认父类是object
object是所有类的父类,所有类都继承object
小练习:
# 定义一个动物类
class Animal:def run(self):print('动物跑....')def sleep(self):print('动物睡觉...')# 要定义一个狗类
# 1.直接修改动物类 - 修改起来比较麻烦,会违反ocp元组
# 2.直接创建一个新的类(狗类) - 新类比较麻烦,使用大量的复制粘贴,会出现大量的重复性代码
# 3.直接从Animal类中继承它的属性和方法
class Dog(Animal):def home(self):print('狗看家')
#调用一下:
dog = Dog()
dog.run()
dog.sleep()
dog.home()
# >>>动物跑....
# >>>动物睡觉...
# >>>狗看家
# 如果在Dog类中重新定义了run()方法和sleep()方法,则将会覆盖掉父类中的方法,将不再继承父类中的方法如:
class Dog0(Animal):def run(self):print('狗跑....')def sleep(self): print('狗睡觉...')
dog1 = Dog0()
dog1.run()
dog1.sleep()
# >>> 狗跑....
# >>> 狗睡觉...
isinstance()检查一个实例是不是属于一个类
print(isinstance(dog,Dog0))
print(isinstance(dog,Dog))
print(isinstance(dog,Animal))# >>> False
# >>> True
# >>> True
issubclass() # 检查一个类是不是另一个类的子类
print(issubclass(Dog,Animal))
print(issubclass(Dog,object))
print(issubclass(Animal,object))
print(issubclass(Person,object))# >>> True
# >>> True
# >>> True
# >>> True
二、方法的重写
如果在子类中有和父类重名的方法,通过子类的实例去调用方法时,
会调用子类的方法而不是父类的方法,这个特点称之为方法的重写(覆盖 override)
class A(object):def test(self):print('A....')class B(A):def test(self):print('B....')class C(B):def test(self):print('C....')
c = C()
c.test()# >>> C....
当我们去调用一个对象的时候
会优先去当前对象寻找是否就有该方法,如果有直接调用
如果没有,则去当前对象的父类中去寻找,如果有直接调用父类中的方法
如果没有, 则去父类中的父类寻找,如果有直接调用,以此类推,指导找到object,如果依然没有就报错
三、super()
定义一个动物类
class Animal:def __init__(self,name):self._name = namedef run(self):print('动物跑....')def sleep(self):print('动物睡觉...')@propertydef name(self):return self._name@name.setterdef name(self,name):self._name = namea =Animal('猴子')
a.sleep() # >>> 动物睡觉...
a.run() # >>> 动物跑....
print(a.name)#因为@property 已经将name转化为了一个对象不再是一个方法了,所以直接调用,不用加括号# >>> 猴子
a.name = '犀牛'
print(a.name) # >>> 犀牛
希望可以直接调用父类的__init__来初始化父类中的属性
super()可以用来获取当前类的父类
并且通过super()返回的对象,调用父类方法时不需要传递self
class Dog(Animal):def __init__(self,name,age): # self._name = name # 希望可以直接调用父类的__init__ super().__init__(name)self._age = agedef run(self):print('狗跑....')def sleep(self):print('狗睡觉...')@propertydef age(self):return self._age@age.setterdef age(self,age):self._age = aged = Dog('二哈',10)
print(d.name) # >>> 二哈
d.name = '德牧'
print(d.name) # >>> 德牧
d.run() # >>> 狗跑....
四、多重继承
语法: 类名.bases 可以用来获取当前类的所有父类
在Python中是支持多重继承的,也就是我们可以为一个类同时指定多个父类
class A(object):def test(self):print('A....')# pass
class B(object):def test(self):print('B中的test方法')def test2(self):print('B....')class C(B,A):passprint(C.__bases__) # >>> (<class '__main__.B'>, <class '__main__.A'>)
c = C()
c.test() # >>> B中的test方法
c.test2() # >>> B....
在上例中虽然class C同时继承了A、B的方法,但是在定义的过程中先继承了B类中的方法(B写在前面)此时就近在B中继承方法,如果在B中没有才会向下一个继承的类中寻找对应的方法。如:
class C(A, B):passprint(C.__bases__)
c = C()
c.test()
c.test2()
执行结果则为
>>> (<class '__main__.A'>, <class '__main__.B'>)
>>> A....
>>> B....
如果多个父类中有同名的方法,则会在第一个父类中寻找,然后找第二个…
前边会覆盖后面的
在开发中没有特殊情况,尽量避免使用多重继承,因为多重继承会让我们代码过于复杂
五、多态
面向对象的三大特征之一
多态字面上理解多种形态
就是同一操作(方法)作用于不同的对象时,可以有不同的解释,产生不同的执行结果。
# 一个对象可以以不同的形态去呈现
# 定义一个类
class A:def __init__(self,name):self._name = name@propertydef name(self):return self._name@name.setterdef name(self,name):self._name = nameclass B:def __init__(self,name):self._name = name@propertydef name(self):return self._name@name.setterdef name(self,name):self._name = name# 定义一个方法
def speak(obj):print('你好 %s'%obj.name)a = A('张三')
b = B('李四')
speak(a)
speak(b)
>>> 你好 张三
>>> 你好 李四
上述代码可知,定义的A、B两类都可以用speak方法调用实例a、b。同样也可以定义更多的方法来调用实例。而不同的方法调用实例呈现出来的方法也是不一样的,这个就是类的多态性。同样也可以在方法中限制多态性,代码如下:
def speak2(obj):# 类型检查if isinstance(obj,A):print('你好 %s'%obj.name)speak2(a) # >>> 你好 张三
speak2(b) # >>> (无结果)
在该方法中,类被限制,也就是说在该方法只能调用A类的实例,不能调用B。此时就不具备多态了。
六 类中的属性和方法
类属性
class A(object):# 类属性 直接在类中定义的属性就是类属性# 类属性可以通过类或类的实例访问到# 类属性只能通过类对象来修改,无法通过实例对象来修改count = 0a = A() #创建a的实例
print(a.count) # >>> 0
a.count = 10
print(a.count) # >>> 10
print(A.count) # >>> 0
A.count = 20
print(a.count) # >>> 10
print(A.count) # >>> 20
在上述输出代码中第一个输出是实例a所继承的类属性。
实例属性
def __init__(self):# 实例属性,通过实例对象添加的属性属于实例属性# 实例属性只能通过实例属性来访问和修改,类对象无法访问和修改self.name = '葫芦娃'
实例方法
# 实例方法# 在类中定义,以self为第一个参数都是实例方法# 实例方法在调用时,Python会将调用对象作为self传入# 通过类对象调用时,不会自动传self,必须手动传selfdef test(self):print('我是test方法')
类方法
# 类方法# 类方法的第一个参数是cls,也会被自动传递,cls就是当前的类对象# 类方法可以通过类去调用,也可以通过实例调用@classmethoddef test2(cls):print('我是test2方法.........',cls)print(cls.count)
静态方法
# 静态方法# 静态方法,基本上是一个和当前类无关的方法,它只是一个保存到当前类中的函数# 静态方法一般都是些工具方法,和当前类无关@staticmethoddef test3():print('我是test3方法........')
python第十四课 面向对象(三)相关推荐
- 十四、Python第十四课——文件和异常
(请先看这篇文章:https://blog.csdn.net/GenuineMonster/article/details/104495419) 如果看完这篇博文,你的问题还是没有解决,那么请关注我的 ...
- python六十四课——高阶函数练习题(一)
1.lt = ['sdfasdfa', 'ewqrewrewqr', 'dsafa12312fdsafd', 'safsadf'] --> 得到长度列表2.tp = ('TOM', 'Lilei ...
- python dataframe 新列_Python第二十四课:Pandas库(四)
Python第二十四课:Pandas库(四)点击上方"蓝字",关注我们. 不知不觉,我们已经跨越了千难万险,从零开始,一步步揭开了Python神秘的面纱.学到至今,回过头,才晓得自 ...
- 实践数据湖iceberg 第三十四课 基于数据湖icerberg的流批一体架构-流架构测试
系列文章目录 实践数据湖iceberg 第一课 入门 实践数据湖iceberg 第二课 iceberg基于hadoop的底层数据格式 实践数据湖iceberg 第三课 在sqlclient中,以sql ...
- 计算机教案精美图片我收集,人教版三年级信息技术《第十四课 美化图片我来做》教案(精品获奖)...
教学设计 编写者 执教者 执教时间 6月14日星期五 版本 人教版 学科 信息技术 册数 三年级(下册) 单元 课题 第十四课 美化图片我来做 课时 教学目标 一课时 通过调整图片的明暗和色调以及处理 ...
- Python基础十五:面向对象编程四:高级特性
Python基础十五:面向对象编程四:高级特性 Python基础系列内容为学习廖雪峰老师Python3教程的记录,廖雪峰老师官网地址:廖雪峰Python3教程 Author:yooongchun Em ...
- 孙鑫mfc学习笔记第十四课
第十四课 网络的相关知识,网络程序的编写,Socket是连接应用程序与网络驱动程序的桥梁,Socket在应用程序中创建,通过bind与驱动程序建立关系.此后,应用程序送给Socket的数据,由Sock ...
- 计算机病毒ppt教案免费,第十四课 计算机病毒 课件(共14张ppt)+教案
第十四课 计算机病毒 课件(共14张ppt)+教案 ==================资料简介====================== 第十四课 计算机病毒 课件:14张PPT 第十四课 计算机 ...
- window.addeventlistener 不能调用方法_Java入门第十四课:如何定义”方法“
第十四课,学习定义方法.一个对象包含三种最常见的成员:构造器.Field和方法.Field用于定义状态数据,而方法是行为特征的抽象. 那么什么是方法呢? 在Java中,方法就是用来完成解决某件事情或实 ...
最新文章
- hdu 1879 继续畅通工程
- NeHe OpenGL第十课:3D世界
- 栈和队列的区别 | 每日趣闻
- MATLAB安装相机驱动
- 关于Oracle中in,exists 与 not in, not exists
- 关于JavaScript(脚本语言)
- 加密和解密.net配置节
- Python time strptime()方法 时间操作
- vue如何取消下拉框按回车自动下拉_Web自动化测试 | Select下拉框
- MFC模块的动态链接库DLL以及静态链接库LIB编译后的调用
- 【无码专区9】序列统计(带权并查集 + 前缀和建边 + dp)
- c#仿QQ安全管家事例(附:源码下载)
- android 加网络权限管理,Android添加用户组及自定义App权限的方法
- Hyperledger Fabric 实战(十): Fabric node SDK 样例 - 投票DAPP
- 排序算法速度测试(插入排序、二分法插入、选择排序、快速排序、堆排序)js实现...
- 西北乱跑娃 --- python繁体字简体字互转第三方库
- Ubuntu环境下利用Stress对CPU进行满载及半载压力测试
- 2021大学网课答案搜题公众号
- STL CSB 11.10
- 各社交网站页面分享代码链接