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 ...
随机推荐
- poj1185-炮兵阵地(状态压缩dp)
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 25647 Accepted: 9892 Description ...
- 微信android手机中点击大图片会自动放大图片
自己使用的是微信Android客户端,使用img标签的src属性将图片设置好了以后,在微信中调试,点击图片竟然放大,自己没写放大图片的方法,也没有调用wx.previewImage()方法,最后查找, ...
- 【转】说说Runnable与Callable
说说Runnable与Callable Callable接口: Runnable接口: 相同点: 两者都是接口:(废话) 两者都可用来编写多线程程序: 两者都需要调用Thread.start( ...
- @vue/cli 3.x项目脚手架 webpack 配置
@vue/cli 是一个基于 Vue.js 进行快速开发的完整系统. @vue/cli 基于node服务 需要8.9以上版本 可以使用 nvm等工具来控制node版本 构建于 webpack ...
- To the world you may be one person, but to one person you may be the world.
To the world you may be one person, but to one person you may be the world.对于世界而言,你是一个人:但对于某人而言,你是他的 ...
- GreenDao 3.x 注解中ToOne和ToMany的个人理解
GreenDao是什么东西这个就不用多说了.自从GreenDao升级到3.0之后,编译的方法发生了改变.当然这个改变是有助于快速开发的. 区别在哪随便百度一下都可以知道.这里就不多说了. 这里主要说的 ...
- Integer的一个小问题
看面试题的时候看到这道题: public class Demo { public static void main(String[] args) { Integer i1 = 128; Integer ...
- UVA 211 The Domino Effect 多米诺效应 (回溯)
骨牌无非两种放法,横着或竖着放,每次检查最r,c最小的没访问过的点即可.如果不能放就回溯. 最外面加一层认为已经访问过的位置,方便判断. #include<bits/stdc++.h> ; ...
- duboo 配置文件
官方文档 http://dubbo.apache.org/en-us/docs/user/quick-start.html 自己的 <?xml version="1.0" e ...
- PHP程序Laravel框架的优化技巧
Laravel是一套简洁.优雅的php Web开发框架(PHP Web Framework).它可以让你从杂乱的代码中解脱出来,可以帮你构建一个完美的网络app,而且每行代码都简洁.富于表达力.而性能 ...