一、面向对象
1.1 基本概念
面向对象:是一种抽象化的编程思想,将编程当成一个事物,对外界来说,事物是直接使用的,不用管内部情况,编程就是设置事物能做什么事
类:是对一系列具有相同特征和行为的事物的统称,是一个抽象的概念,不是真实存在的
- 特征:即属性
- 行为:即方法
对象(实例):是类创建出来的真实存在的事物,先有类,再有对象
类和对象关系:类用来创建对象
self:指调用该函数的对象,打印self和对象结果一致,都是当前内存中存储地址
1.2 面向对象三大特性
- 封装:将属性和方法书写到类的里面的操作,封装可以为属性和方法添加私有权限
- 继承:子类默认继承父类的所有属性和方法,子类可以重写父类属性和方法
- 多态:指一类事物有多种形态,是一种使用对象的方式,子类重写父类方法,传入不同的子类对象的相同父类方法,产生不同的结果
1.3 类属性和实例属性
- 类属性:是类对象所拥有的属性(直接在类中定义的属性),被该类的所有实例对象所共有
- 访问类属性:类对象(类名.类属性)或实例对象(对象.类属性)
- 修改类属性:只能通过类对象(类名.类属性)修改,若通过实例对象修改,则表示创建了一个实例属性
- 特点
- 记录的某项数据始终保持一致时,则定义类属性
- 类属性为全类所共有,仅占一份内存,更加节省内存空间
- 实例属性:在__init__(self)中定义的属性
- 访问实例属性:实例对象(对象.实例属性),不能通过类对象(类名.实例属性)访问
- 修改实例属性:通过实例对象(对象.实例属性)修改
- 特点:实例属性要求每个对象为其单独开辟一份内存空间来记录数据
1.4 类方法和静态方法
- 类方法:方法前用@classmethod标识,第一个参数必须是类对象,一般为cls
- 使用场景
- 方法中需要使用类对象(如访问私有类属性等)时,定义类方法
- 类方法一般和类属性配合使用
- 使用场景
- 静态方法:方法前用@staticmethod标识,无需传递类对象或实例对象(无形参self/cls)
- 访问:通过实例对象和类对象访问
- 使用场景
- 方法中无需使用实例对象和类对象时,定义静态方法
- 取消不必要的参数传递,有利于减少不必要的内存占用和性能消耗
二、魔法函数
2.1 __init__()
作用:初始化对象,在创建一个对象时默认被调用,无需手动调用,可带参数
__init__(self)中self参数,无需开发者传递,python解释器会自动把当前对象引用传递过去
2.2 __str__()
使用print输出对象时
- 默认打印对象的内存地址
- 若类中定义了__str__方法,就会打印从该方法中return的数据
2.3 __del__()
删除对象时,python解释器会默认调用__del__()方法
三、继承
继承:指多个类之间的所属关系,子类默认继承父类所有属性和方法
object类:是顶级类或基类,所有类默认继承object类,其他子类称为派生类
- 单继承:一个类只继承一个父类
- 多继承:一个类同时继承了多个父类
子类重写父类同名方法和属性,此时子类和父类具有同名属性和方法,默认使用子类的属性和方法
子类调用父类的同名的方法和属性
- 需先调用父类的初始化方法__init__(self)
- super()调用父类方法,可以自动查找父类,适合单继承使用
方法1:
super(当前类名, self).__init__()
super(当前类名, self).方法名()
方法2:
super().__init__()
super().方法名()
方法3:代码冗余,若父类类名变化,需频繁更改
父类名.__init__(self)
父类名.方法名(self)
四、私有权限
4.1 定义私有属性和方法
python中,可以为实例属性和方法设置私有权限,即设置某个属性或方法不继承给子类
- 定义方法:在属性名和方法名前面加上两个下划线__
- 定义后,对象不能访问私有属性和私有方法,子类无法继承父类的私有属性和私有方法
- 私有属性和私有方法只能在类里面访问和修改
4.2 获取和修改私有属性值
- 获取私有属性:定义函数名get_xx(self)
- 修改私有属性值:定义函数名set_xx(self)