前言:
我们通过上篇文章学习了Python的基础语法,接下来我们来学习Python的高阶语法
1.初识对象
在Python中我们可以做到和生活中那样,设计表格、生产表格、填写表格的组织形式的
面向对象包含 3 大主要特性:
封装
继承
多态
(内容靠后)
1.1使用对象组织数据
在程序中设计表格,我们称之为:设计类(class)
在程序中打印生产表格,我们称之为:创建对象
在程序中填写表格,我们称之为:对象属性赋值
2.成员方法
2.1类的定义和使用
类的语法:
创建类对象的语法:
类
2.2成员变量和成员方法
我们可以看出,类中:
• 不仅可以定义属性用来记录数据
• 也可以定义函数,用来记录行为其中:
• 类中定义的属性(变量),我们称之为:成员变量
• 类中定义的行为(函数),我们称之为:成员方法注意:
定义在类内部的函数,我们称之为方法
2.3成员方法的定义语法
在类中定义成员方法和定义函数基本一致,但仍有细微区别:
我们可以看到,在方法定义的参数列表中,有一个: self 关键字
self 关键字是成员方法定义的时候,必须填写的
• 它用来表示类对象自身的意思
• 当我们使用类对象调用方法的时候, self 会自动被 python 传入注意:
在方法内部,想要访问类的成员变量,必须使用 self
例如:
不过,self 关键字,尽管在参数列表中,但是传参的时候可以忽略它
可以看到,在传入参数的时候, self 是透明的,可以不用理会它
3.类和对象
3.1面向对象编程
类只是一种程序内的“设计图纸”,需要基于图纸生产实体(对象),才能正常工作
这种套路,称之为:面向对象编程
3.2语法
基于类创建对象的语法:
3.3在程序中通过类来描述
3.4基于类创建对象
4.构造方法
4.1属性(成员变量)的赋值
这种方法略显繁琐
4.2 __init__()构造方法
• 构建类时传入的参数会自动提供给 __init__ 方法
• 构建类的时候 __init__ 方法会自动执行注意:
构造方法也是成员方法,不要忘记在参数列表中提供: self
5.魔术方法
5.1 __str__ 字符串方法
当类对象需要被转换为字符串之时,会输出如下结果(内存地址)
我们可以通过 __str__ 方法,控制类转换为字符串的行为
5.2 __lt__ 小于符号比较方法
直接对 2 个对象进行比较是不可以的
但是在类中实现 __lt__ 方法,即可同时完成:小于符号 和 大于符号 2 种比较
比较大于的魔术方法是:__gt__
5.3__le__ 小于等于比较符号方法
用法跟上面一样
5.4 __eq__ 比较运算符实现方法
注意:
不实现 __eq__ 方法,对象之间可以比较,但是是比较内存地址,也即是:不同对象 == 比较一定是 False 结果
6. 封装
6.1对用户隐藏的属性和行为
现实世界中的事物,有属性和行为
但是不代表这些属性和行为都是开放给用户使用的苹果越狱、安卓 root ,也是为了突破权限使用这些对用户隐藏的属性和行为
6.2私有成员
类中提供了私有成员的形式来支持。
• 私有成员变量
• 私有成员方法定义私有成员的方式非常简单,只需要:
• 私有成员变量:变量名以 __ 开头( 2 个下划线)
• 私有成员方法:方法名以 __ 开头( 2 个下划线)
6.3使用私有成员
私有方法无法直接被类对象使用
私有变量无法赋值,也无法获取值
私有成员无法被类对象使用,但是可以被其它的成员使用
7.继承
7.1什么是继承?
继承表示:将从父类那里继承(复制)来成员变量和成员方法(不含私有)
代码的实现
并且,继承分为:单继承和多继承
7.2单继承
语法:
操作:
7.3多继承
Python 的类之间也支持多继承,即一个类,可以继承多个父类
如下:
语法:
操作:
注意:
多个父类中,如果有同名的成员,那么默认以继承顺序(从左到右)为优先级
即:先继承的保留,后继承的被覆盖
7.4复写
子类继承父类的成员属性和成员方法后,如果对其“不满意”,那么可以进行复写
即:在子类中重新定义同名的属性或方法即可
7.5调用父类同名成员
一旦复写父类成员,那么类对象调用成员的时候,就会调用复写后的新成员
如果需要使用被复写的父类的成员,需要特殊的调用方式
方式1:
• 调用父类成员
使用成员变量:父类名 . 成员变量
使用成员方法:父类名 . 成员方法 (self)方式 2 :
• 使用 super() 调用父类成员
使用成员变量: super(). 成员变量
使用成员方法: super(). 成员方法 ()注意:
只能在子类内调用父类的同名成员
子类的类对象直接调用会调用子类复写的成员