以是什么
和为什么
的角度学习 Python面向对象编程,和Java对比
D1
面向对象
- 面向对象:以特征(属性)和行为(方法)的观点去分析现实世界中事务的方式
- 面向对象编程:先使用面向对象的方式进行分析,再使用任意一门面向对象的编程语言进行翻译的过程
类class
- 是什么:人类(对具有相同特征和行为的多个对象共性的抽象描述,在Java语言中包含描述特征的成员变量和描述行为的成员方法,是创建对象的模板)
- 为什么:对象太多了,代码重复量太大,也描述不过来,所以把他们共性的东西提取出来形成一个类!
对象new
- 是什么:我这个人(客观存在的实体,在Java语言体现为内存空间的一块区域)
- 为什么:类是抽象的概念,不能干活,要想干活就得依赖这一类的实体(对象)!
实例化对象
- 是什么:曹阳 = 人()
- 人的类型是type,曹阳的类型是人
成员变量和成员方法
- 成员变量:身高、体重(特征)
- 成员方法:吃喝玩乐(行为)
方法分类
- 绑定类的方法,只能通过类来访问的方法,就是绑定类的方法
- 非绑定类的方法,就是可以通过对象访问的方法就是非绑定的方法
self
- 是什么:他不是关键字,是一个随意书写的表示自己的字符串
- 为什么:一般情况下非绑定类的方法第一个参数写单词self,但是这不是唯一的单词,写什么都行,self不是关键字
封装
- 是什么:封装就是对类和对象的成员访问进行限制,设定可以访问的方式和不可以访问的方式
- 为什么:main方法不是某个类独有的,不应该放在类里,单独放到一个测试类里。在测试类里可以随便改成员变量信息,合法但不合理,那不行,得封装起来!
<!– 3. 怎么用:- 我的车是我自己的(私有化成员变量)只有我能开;
- 我借你开(公有化get和set方法)你才能开,我借你车你开坏了也不行奥(set方法里加判断);
- 听话就可以开走了(构造方法里调set方法) –>
继承extends
- 是什么:教师学生都是人,都得吃饭睡觉(继承就是可以获取另外一个类中的成员属性和成员方法 )
- 为什么:除了吃饭睡觉,教师学生也都得喝水,那也不能挨个加啊,直接在人类里加一个就行了(继承的作用是增加代码的复用性,节省不必要的重复代码,提高开发效率,同时可以设置类之间的关系)
<!– 3. 怎么用:- 儿子不能跟爸爸平辈也不能管妈妈叫媳妇啊(子类不能继承父类的构造方法和私有方法),爸爸有名儿子也得有名啊,总不能一直叫谁谁谁的儿子吧,但是你也不能跟你爸用一个名吧(私有特征可以继承但不能访问)
- 儿子生出来就遗传了爸爸的基因(当构造子类对象时会自动构造父类的无参构造方法来初始化从父类中继承下来的成员变量,相当于在子类构造方法的第一行增加代码
super();
的效果) - 一个爸爸可以有多个儿子,但一个儿子只能有一个爸爸(Java语言中只支持单继承)
- 儿子必须是爸爸亲生的才能继承他的基因(使用继承必须满足逻辑关系:子类 is a 父类) –>
- 区别:Java是单继承,Python是多继承
方法重载super()
- 是什么:爸爸赚的钱不够花了,你就得自己挣了
- 为什么:子类可以重载父类中的方法,只需要设置和父类指定成员相同的名称即可实现重载,重载之后的成员,子类只会访问当前类中的成员,而不会调用父类中同名的成员
访问控制
Java | Python | 访问权限 | 本类 | 本包中的类 | 子类 | 其他包中的其他类 |
---|---|---|---|---|---|---|
public | 默认 | 公有的 | ok | ok | ok | ok |
protected | _ | 保护的 | ok | ok | ok | no |
default | 没有这个 | 默认的 | ok | ok | no | no |
private | __ | 私有的 | ok | no | no | no |
MRO列表(Python)
- 是什么:Method Realtion Order 用来制作一个继承关系的列表
- MRO列表的制作原则
- 子类永远在父类的前面
- 如果继承了多个父类,那么按照()中的顺序在列表中摆放
- 如果多个类同时继承了一个父类,孙子类中只会选取第一个父类中的父类的该方法
super()(Python)
- 是什么:super不是一个关键字,也是不是有函数,他是一个类,super()的作用不是查找父类,而是找MRO列表的上一个类
- 怎么用:super()和父类没有任何实质性的关系,只是有时候能调用到父类而已。在单继承的情况下,super()永远调用的是父类/父对象
mixin设计模式(Python)
- 主要作用是采用多继承方式,进行类的扩展
- 水果类 礼物类和非礼物类 南方北方类 真实水果类
D23
魔术方法
- 是什么:法就是一个类/对象中的方法,和普通方法唯一的不同时,普通方法需要调用!而魔术方法是在特定时刻自动触发
- 为什么:当一个类(通常是用户的定制类、或继承类)实现或重载了这样的魔术方法,就可以开始施展魔术了,比如实现了
__getitem__()
就可以像数组那样使用下标访问集合的每一个元素,而__repr__()
则用来自定义对象的输出行为
类的常用函数
描述符
- 是什么:用于描述对象中的属性。主要作用就是对属性操作提供限制,验证,管理等相关权限的操作
装饰器
类的内置属性
装饰器
方法的分类
- 实例方法/对象方法
- 绑定类的方法/静态方法
- 类方法
抽象类
多态
包package
- 是什么:就是文件夹
__init__.py
- 为什么:让大家都写一个类,最后命名全是一样的,发给我就冲突了,放在一个不同的目录里就好了(便于管理,避免命名冲突的问题)
- 怎么用:公司或组织域名的反写.项目名.模块名.类名