面向对象的三大特性————继承,多态
1,继承:继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称派生类或子类。
一个类可以被多个类继承,一个类可以继承多个父类。
没有继承父类默认继承object-----新式类,python3中都是新式类,object是所有python类的父类。
1.1单继承
class A():pass #父类 class B():pass #父类 class Ab(A):pass #单继承 class C(A,B):pass #多继承
查看继承
class A():pass class Av(object):pass class B():pass class Ab(A,B):pass print(Ab.__bases__) print(A.__bases__) print(Av.__bases__) #(<class '__main__.A'>, <class '__main__.B'>) #(<class 'object'>,) #(<class 'object'>,)
抽象与继承,抽象即抽取类似或者说比较像的部分。
继承:是基于抽象的结果,通过编程语言去实现它,先抽象,再用继承的方式去表达出抽象的结构。
class Animal:def __init__(self,name,aggr,hp):self.name = nameself.aggr = aggrself.hp = hpdef eat(self):print('吃药回血')self.hp+=100class Dog(Animal):def __init__(self,name,aggr,hp,kind):Animal.__init__(self,name,aggr,hp) # self.kind = kind # 派生属性def eat(self):# Animal.eat(self) super().eat()# 如果既想实现新的功能也想使用父类原本的功能,还需要在子类中再调用父类self.teeth = 2def bite(self,person): # 派生方法person.hp -= self.aggrjin = Dog('金老板',100,500,'吉娃娃') jin.eat() print(jin.hp)class Person(Animal):def __init__(self,name,aggr,hp,sex):Animal.__init__(self,name,aggr,hp)self.sex = sex # 派生属性self.money = 0 # 派生属性def attack(self,dog):dog.hp -= self.aggrdef get_weapon(self,weapon):if self.money >= weapon.price:self.money -= weapon.priceself.weapon = weaponself.aggr += weapon.aggrelse:print("余额不足,请先充值") alex = Person('alex',1,2,None) alex.eat() print(alex.hp)jin.bite(alex) print(alex.hp)
View Code
在子类中,新建的重名的函数属性,在编辑函数内功能的时候,有可能需要父类中重命名的那个函数功能,应该使用调用普通函数的方式,即:类名.func(),在python3中,子类执行父类的方法可以直接用supre.func()方法。
class A:def hahaha(self):print('A')class B(A):def hahaha(self):super().hahaha()#super(B,self).hahaha()#A.hahaha(self)print('B')a = A() b = B() b.hahaha() super(B,b).hahaha()
View Code
父类中没有的属性,在子类中出现叫做派生属性;父类中没有的方法在子类中出现叫派生方法。
只要是子类的对象调用,子类中有的名字一定用子类,子类没有的才找父类。如果子类父类都有的,用子类的,用父类的,需要调用父类的:父类名.方法名,需要自己传self,super().方法名,不需要传self。
2,多继承
mro方法,查看继承顺序
新式类中的继承顺序:广度优先
# class A(object): # def func(self): print('A') # # class B(A): # def func(self): # super().func() # print('B') # # class C(A): # def func(self): # super().func() # print('C') # # class D(B,C): # def func(self): # super().func() # print('D') # # b = D() # b.func() # print(B.mro()) #A,C,B,D
View Code
经典类中深度优先(没有mro方法)
super的本质:不只是单纯的找父类而是根据调用者的节点位置的广度优先顺序来的。
3,接口类与抽象类
3.1接口类:python原生不支持的
规范格式:模块abc模块
# from abc import abstractclassmethod,ABCMeta # class Animal(metaclass=ABCMeta): # @abstractclassmethod # def pay(self,money): # pass # class Wecchat(Animal): # def pay(self,money): # print("已用微信支付了%s元"%money) # # class Alipay(Animal): # def pay(self,money): # print("已用支付宝支付了%s元"%money)# class Applepay(Animal): # def pay(self,money): # print("已用App支付了%s元"%money) # def pay(pay_obj,moeny): # pay_obj(moeny) # # # wechat=Wecchat() # ali=Alipay() # app=Applepay() # wechat.pay(23) # ali.pay(54) # app.pay(23)
View Code
3.2抽象类
类是从一堆对象中抽取相同的内容而来,那么抽象类就是从一堆类中抽取相同的内容而来的。
抽象类:规范
一般情况下单继承能实现的功能都是一样的,所以在父类中可以有一些简单的基础实现,多继承的情况由于功能比较复杂,所以不容易抽象出相同的功能的具体实现写在父类中。
#一切皆文件 import abc #利用abc模块实现抽象类class All_file(metaclass=abc.ABCMeta):all_type='file'@abc.abstractmethod #定义抽象方法,无需实现功能def read(self):'子类必须定义读功能'with open('filaname') as f:pass@abc.abstractmethod #定义抽象方法,无需实现功能def write(self):'子类必须定义写功能'passclass Txt(All_file): #子类继承抽象类,但是必须定义read和write方法def read(self):print('文本数据的读取方法')def write(self):print('文本数据的读取方法')class Sata(All_file): #子类继承抽象类,但是必须定义read和write方法def read(self):print('硬盘数据的读取方法')def write(self):print('硬盘数据的读取方法')class Process(All_file): #子类继承抽象类,但是必须定义read和write方法def read(self):print('进程数据的读取方法')def write(self):print('进程数据的读取方法')wenbenwenjian=Txt()yingpanwenjian=Sata()jinchengwenjian=Process()#这样大家都是被归一化了,也就是一切皆文件的思想 wenbenwenjian.read() yingpanwenjian.write() jinchengwenjian.read()print(wenbenwenjian.all_type) print(yingpanwenjian.all_type) print(jinchengwenjian.all_type)
View Code
抽象类和接口类:面向对象开发规范所有的接口类和抽象类都不能实例化。
# python # python中没有接口类 :# python中自带多继承 所以我们直接用class来实现了接口类 # python中支持抽象类 : 一般情况下 单继承 不能实例化# 且可以实现python代码
接口类与抽象类的总结:
pyhton中没有接口类,有抽象类,abc模块中metaclass=ABCMeta,@abstructmethod
本质是用来做代码规范的,希望在子类中实现和父类方法名字完全一样的方法。
抽象类与接口类的区别:
在java的角度上看是有区别的,java本来就支持单继承,所以有了抽象类;但java没有多继承,所以为了接口隔离原则,设计了接口这个概念,支持了多继承。
python中既支持单继承也支持多继承,所以对于接口类和抽象类的区别就不太明显,甚至在python中没有内置接口类。
二,多态
Python天生支持多态,多态指的是一类事物有多种形态
多态性是指在不考虑实例类型的情况下使用实例
鸭子类型:不依赖父类的情况下实现两个相似的类中的同名方法。
序列类型有多种形态:字符串,列表,元组,但它们没有直接的继承关系
# list tuple # 不崇尚根据继承所得来的相似 # 只是自己实现我自己的代码就可以了。 # 如果两个类刚好相似,并不产生父类的子类的兄弟关系,而是鸭子类型 # list tuple 这种相似,是自己写代码的时候约束的,而不是通过父类约束的 # 优点 : 松耦合 每个相似的类之间都没有影响 # 缺点 : 太随意了,只能靠自觉# class List(): # def __len__(self):pass # class Tuple(): # def __len__(self):pass # # def len(obj): # return obj.__len__() # # l = Tuple() # len(l) # # # 强类型语言 多态 # # python 语言 鸭子类型
转载于:https://www.cnblogs.com/glf1160/p/8310923.html
面向对象的三大特性————继承,多态相关推荐
- Java学习笔记二十五:Java面向对象的三大特性之多态
Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...
- polymorphism java_Java基础-面向对象第三大特性之多态(polymorphism)
Java基础-面向对象第三大特性之多态(polymorphism) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 多态是继封装,继承之后,面向对象的第三大特性,多态的 ...
- 面向对象的三大特性之多态
面向对象的三大特性之多态 文章目录 面向对象的三大特性之多态 前言 一.静态多态 1.函数重载 2.函数模板 二.动态多态 1.函数重写 2.虚函数的继承特性 三.重定义 前言 多态的简单定义为同一种 ...
- 面向对象之三大特性:继承,封装,多态
python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分 ...
- 面向对象的三大特性之多态,封装基础
面向对象的三大特性 : 继承 多态 封装 多态:一个类表现出多种形态:通过继承来实现的 在python中:由于函数的参数不需要指定数据类型,所以也不需要通过继承的形式来统一一组类的类型 ...
- C++ 面向对象程序三大特性之 多态
目录 多态的概念 多态的定义及使用 虚函数 虚函数的重写 虚函数重写的两个例外 C++11中 override 和 final 重载.重写.隐藏的区别与联系 抽象类 多态的原理 虚函数指针.虚函数.虚 ...
- Python面向对象编程三大特性之多态
多态 code:_9polymorphism.py # ***************************************** """ 多态:对于同一个方法, ...
- 【Golang第8章:面向对象编程】Go语言的结构体是什么,怎么声明;Golang方法的调用和声明;go语言面向对象实例,go语言工厂模式;golang面向对象的三大特性:继承、封装、多态
介绍 这个是在B站上看边看视频边做的笔记,这一章是Glang面向对象编程 这一章内容较多,内容有Go语言的结构体是什么,怎么声明:Golang方法的调用和声明:go语言面向对象实例,go语言工厂模式: ...
- C++ 面向对象程序三大特性之 继承
目录 继承的概念 继承的定义及使用 继承方式和访问权限 基类和派生类对象的赋值转换 继承中的各成员的作用域 派生类的默认成员函数 构造函数 拷贝构造 赋值运算符重载函数 析构函数 继承与友元 继承与静 ...
最新文章
- js实现下拉框三级级联
- matlab 创建批量文件夹_Matlab开发Web App服务器(一)
- python构建网站flask_30分钟搭建Python的Flask框架并在上面编写第一个应用
- nginx rewrite
- 苹果宣布3月7日召开发布会 预期推iPad 3
- asp.net core新特性(1):TagHelper
- 设置Elasticsearch N-Gram Word分析器的过程
- 前端布局之网格gird布局(简单易懂)
- 复练-面试的科技树-我是谁、我喜欢、我能够
- IE CSS Bug及解决方案参考手册
- spark 如何用netty实现akka的actor模型
- 学python能做什么类型的工作-python是什么?python可以用来干什么?
- CF621E Wet Shark and Blocks
- Smart SVN客户端使用
- 随处可用的坐姿小帮手,还能按摩热敷,荣泰P30按摩坐垫体验
- 人物连连看 python课程设计 pygame学习
- Android接腾讯Bugly没有上传崩溃日志
- 国家开放大学2021春2623中医药学概论题目
- BLAST原理和用法总结(一)
- 北京 买房 提取 公积金
热门文章
- python笔记之变量(variable)
- php检查图片大小,如何利用Javascript函数检查图片大小
- python旅游推荐系统_如何用Python搭建一个简单的推荐系统?
- 无线对讲调度服务器,无线对讲系统解决方案
- mysqldump单个库导出_初相识 | 全方位认识 sys 系统库
- 手机号段对应地区编码_漫画:“哈夫曼编码” 是什么鬼?
- 10年老电脑如何提速_电信宽带免费提速至200M,面向全国用户活动日期2020年11月9日至12月31日...
- 作业帮电脑版在线使用_互助作业帮PC版-互助作业帮电脑版下载 v4.5.8
- java正则匹配英文句号_「正则表达式」王国奇遇记
- 自定义权限 android,Android权限控制之自定义权限