python基础-面向对象的三大特征
继承
单继承
既用了父类的属性,也同时调用了自己的属性
class Person(Animal): live = '有些人活着,其实....' def __init__(self,name,sex,age,mind): # Animal.__init__(self, name,sex,age) ##利用类名调用属性 super().__init__(name,sex,age) #利用第super()来实现,就节省了self self.mind = mind def eat(self,): Animal.eat(self) print('人类也是需要吃饭的') class Cat(Animal): def __init__(self,name,sex,age,clim): super().__init__(name,sex,age) self.clim = clim class Dog(Animal): pass p1 = Person('大黄', '男', 17,'有思想') print(p1.__dict__) 打印结果: {'name': '大黄', 'sex': '男', 'age': 17, 'mind': '有思想'}
既用了父类的方法,也同时调用了自己的方法
class Animal: live = '活着' def __init__(self,name,sex,age): self.name = name self.sex = sex self.age = age def eat(self): print('动物在吃饭') class Person(Animal): live = '有些人活着,其实....' def eat(self): # Animal.eat(self) #直接使用类名来调用父类的方法 super().eat() ##利用继承关系来实现 print('人类也是需要吃饭的') class Cat(Animal): pass class Dog(Animal): pass p1 = Person('大黄','男',17) c1 = Cat('大橘','母',2) p1.eat() #当子类和父类方法名相同时 # 利用类名+方法的形式,可以在子类的方法中调用父类的方法,来实现既要用子类的功能,又要用父类的功能
多继承
class Shenxian: def fei(self): print('神仙会飞') class Monkey: def chitao(self): print('猴子喜欢吃桃子') class SunWuKong(Shenxian,Monkey): pass obj = SunWuKong() obj.chitao() obj.fei() 打印结果: 猴子喜欢吃桃子 神仙会飞
经典类采用深度优先遍历方案

新式类采用C3算法遍历原则,MRO序列
如计算merge( [E,O], [C,E,F,O], [C] ) 有三个列表 : ① ② ③ 1 merge不为空,取出第一个列表列表①的表头E,进行判断 各个列表的表尾分别是[O], [E,F,O],E在这些表尾的集合中,因而跳过当前当前列表 2 取出列表②的表头C,进行判断 C不在各个列表的集合中,因而将C拿出到merge外,并从所有表头删除 merge( [E,O], [C,E,F,O], [C]) = [C] + merge( [E,O], [E,F,O] ) 3 进行下一次新的merge操作 ......
mro(A) = mro( A(B,C) ) 原式= [A] + merge( mro(B),mro(C),[B,C] ) mro(B) = mro( B(D,E) ) = [B] + merge( mro(D), mro(E), [D,E] ) # 多继承 = [B] + merge( [D,O] , [E,O] , [D,E] ) # 单继承mro(D(O))=[D,O] = [B,D] + merge( [O] , [E,O] , [E] ) # 拿出并删除D = [B,D,E] + merge([O] , [O]) = [B,D,E,O] mro(C) = mro( C(E,F) ) = [C] + merge( mro(E), mro(F), [E,F] ) = [C] + merge( [E,O] , [F,O] , [E,F] ) = [C,E] + merge( [O] , [F,O] , [F] ) # 跳过O,拿出并删除 = [C,E,F] + merge([O] , [O]) = [C,E,F,O] 原式= [A] + merge( [B,D,E,O], [C,E,F,O], [B,C]) = [A,B] + merge( [D,E,O], [C,E,F,O], [C]) = [A,B,D] + merge( [E,O], [C,E,F,O], [C]) # 跳过E = [A,B,D,C] + merge([E,O], [E,F,O]) = [A,B,D,C,E] + merge([O], [F,O]) # 跳过O = [A,B,D,C,E,F] + merge([O], [O]) = [A,B,D,C,E,F,O]
super()的真正含义
class A: def func1(self): print('in A func1') class B(A): def func1(self): super().func1() print('in B func1') class C(A): def func1(self): print('in C func1') class D(B,C): def func1(self): super().func1() #跳过本类,按照MRO的顺序执行下一类 print('in D func1') obj = D() obj.func1() #D类的MRO顺序是:[D,B,C,A] print(D.mro()) #查看该类的执行顺序 打印结果: in C func1 in B func1 in D func1
多态
封装
鸭子类型
class A: def f1(self): print('in A f1') def f2(self): print('in A f2') class B: def f1(self): print('in A f1') def f2(self): print('in A f2') obj = A() obj.f1() obj.f2() obj2 = B() obj2.f1() obj2.f2() # A 和 B两个类完全没有耦合性,但是在某种意义上他们却统一了一个标准。 # 对相同的功能设定了相同的名字,这样方便开发,这两个方法就可以互成为鸭子类型。 # 这样的例子比比皆是:str tuple list 都有 index方法,这就是统一了规范。 # str bytes 等等 这就是互称为鸭子类型。
类的约束
工作中如何对类进行约束,第一种方法,利用调用父类时的pay,就主动报错,raise,Python最常用的方式 class Payment: def pay(self, money): raise Exception('子类需要定义pay方法') class Alipay(Payment): def pay(self, money): print('您用阿里支付了%s元' % money) class QQpay(Payment): def pay(self, money): print('您用QQ支付了%s元' % money) class Wechatpay(Payment): def zhifu(self, money): print('您用微信支付了%s元' % money) obj = Wechatpay() obj.pay(100) 打印结果: obj.pay(100) File "C:/Users/15471/PycharmProjects/newpro/day22/exercise.py", line 45, in pay [<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>] raise Exception('子类需要定义pay方法') Exception: 子类需要定义pay方法
# 方法二 抽象类 接口类 : 制定一个规范,强制子类必须有pay方法,如果没有,在你实例化的时候就会报错 from abc import ABCMeta,abstractmethod class Payment(metaclass= ABCMeta): @abstractmethod def pay(self, money): pass class Alipay(Payment): def pay(self, money): print('您用阿里支付了%s元' % money) class QQpay(Payment): def pay(self, money): print('您用QQ支付了%s元' % money) class Wechatpay(Payment): def zhifu(self, money): print('您用微信支付了%s元' % money) obj = Wechatpay() obj.pay(100) 打印结果: 报错
python基础-面向对象的三大特征的更多相关文章
- python基础--面向对象基础(类与对象、对象之间的交互和组合、面向对象的命名空间、面向对象的三大特性等)
python基础--面向对象 (1)面向过程VS面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. ...
- Python 基础 面向对象之二 三大特性
Python 基础 面向对象之二 三大特性 上一篇主要介绍了Python中,面向对象的类和对象的定义及实例的简单应用,本篇继续接着上篇来谈,在这一篇中我们重点要谈及的内容有:Python 类的成员.成 ...
- Python面向对象初始(三大特征,多态,继承,封装)
Python面向对象的初始 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的 ...
- python基础——面向对象编程
python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...
- python基础——面向对象的程序设计
python基础--面向对象的程序设计 1 什么是面向对象的程序设计 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...
- Java面向对象的三大特征
Java面向对象的三大特征 java面向对象的三大特征:“封装.继承.多态”.更多Java技术知识,请登陆疯狂软件教育官网.微信搜索微信号:疯狂软件,参加2015年优惠活动,有机会获得优惠劵和代金劵. ...
- C#学习笔记7:多态是面向对象的三大特征(封装、继承、多态)之一
多态: 多态是面向对象的三大特征(封装.继承.多态)之一. 什么是多态? 一个对象表现出多种状态. 多态的实现方法: 1.虚方法: 2.抽象方法: 3.接口. PS:New 关键词可以隐藏父类的方法. ...
- OC面向对象的三大特征
OC面向对象的三大特征 1.OC面向对象的三大特封装 1)封装:完整的说是成员变量的封装. 2)在成语方法里面的成员变量最好不要使用@public这样会直接暴露在外面被别人随随便便修改,封装的方法还可 ...
- 解析PHP面向对象的三大特征
class BenHang extends Card{ /*构造函数与及构造的继承*/ function __construct($cardno,$pwd, $name,$money){ parent ...
随机推荐
- Nginx功能介绍
Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的. 从2004年发布至今,凭借开元的力量,已经接近成熟与完善. Nginx功能丰富,可作为HTTP服务器,也可作 ...
- P3290 寻找第K大数
描述 寻找第K大数 N个小朋友在一起做游戏.每个小朋友在自己的硬纸板上写一个数,然后同时举起来.接着,小y老师提一个问题,看哪个小朋友先抢答出来.问题是:在这N个数中,第K大的是哪个数?请你编程完成. ...
- spring项目后台中打印sql语句
配置方法很简单,只要在配置文件application.yml加入以下语句 logging: level: main.java.iReview.dao: debug 其中包的位置应为dao层的包位置,不 ...
- mitmproxy抓包软件在mac上边的安装
官网介绍:mitmproxy is a free and open source interactive HTTPS proxy. mitmproxy 是用 Python 和 C 开发的一个中间人代理 ...
- windows系统下Eclipse启动界面更改
前段日子看到有人修改了linux系统下Eclipse的启动界面,因此自己试着修改了一下windows平台的启动界面.本文总结一下修改Eclipse 4.5(代号Mars)启动界面的方法. 方法一:修改 ...
- SAP标准培训课程C4C10学习笔记(二)第二单元
第二单元目录: SAP Cloud for Customer的项目实施分为4个阶段: 这四个阶段的详细介绍在SAP社区上这篇博文里: SAP Hybrid Project implementation ...
- ASUS主板 Type C 接口无效问题
修改UEFI设置,把 USB TYPE C POWER SWITCH 改成启用
- cv2.Canny 边缘检测
Canny边缘检测 Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是: 好的检测 - 算法能够尽可能多地标识出图像中的实际边缘. 好的定位 - 标识出的边缘要尽可能与实际图像中 ...
- Array - Merge Sorted Array
/** * 将nums2中的值合并入nums1,使其仍然有序 * 可以任务nums1的长度>=m+n * @param nums1 已排序数组 * @param m nums1数组已初始化的数目 ...
- VS开发软winform软件的更改用户使用权限
在使用软件的过程中,我们经常需要使用的软件拥有管理员权限,在开发的过程中,本人就遇到了应为权限不足的问题导致软件不能正常使用的状况. 在此我来记录我遇到的问题. 为开发的软件赋予管理员权限 https ...