基于上次的文件基本知识,本篇总结python中重要面向对象知识点。
类与对象的创建
创建类
在不同的python解释器下,类分为两种 经典类 和 新式类
不由任意内置类型派生出的类,称为经典类(python2.0)
1
2class 类名():
代码新式类(python3.0)
1
2class 类名(object): # object 为 python中的顶级类
代码
创建对象
语法
1
对象名 = 类名()
例子
1 | class Washer(): |
self
self指的是调用函数的对象。
即上面代码中函数内打印的self和函数外打印的haier相同。
添加和获取对象属性
属性即是特征,对象属性既可以在类外面添加和获取,也能在类里面添加和获取。
类外面添加对象属性
语法
1
对象名.属性名 = 值
例子
1
2
3# 属性名为自定义的
haier.width = 500
haier.height = 800
类外面获取对象属性
语法
1
对象名.属性名
类里面获取对象属性
语法
1
self.属性名
魔法方法
在python中,__xx__()
函数叫做魔法方法,指的是与有特殊功能的函数。
__init__()
体验__init__()
__init__()
方法作用:初始化对象,设置与生俱来的初始化属性。
1 | class Washer(): |
注意:
__init__()
方法,在创建一个对象时默认被调用。__init__(self)
中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递过去。
带参数的__init__()
思考:一个类可以创建多个对象,如何对不同的对象设置不同的初始化属性呢?
可以使用传递参数的init方法
1 | class Washer(): |
__str__()
当我们使用print输出对象的时候,默认打印对象的内存地址,如果类定义了__str__()
方法,那么就会打印 从这个方法中return的数据。
该方法一般用于返回一些解释说明的语句
1 | class Washer(): |
__del__()
当删除对象时,python解释器就会默认调用该方法。
1 | class Washer(): |
拓展
我们都知道Python一切皆对象,那么Python究竟是怎么管理对象的呢?
1 | class A(object): |
结果:
1 | {'__module__': '__main__', 'a': 0, '__init__': <function A.__init__ at 0x01719610>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None} |
由此可见, 类的静态函数、类函数、普通函数、全局变量以及一些内置的属性都是放在类dict里的。
对象的dict中存储了一些self.xxx的一些东西
继承
Python面向对象的继承指的是多个类之间的所属关系,即子类默认继承父类的所有属性和方法,具体如下:
1 | # 父类A |
继承分为单继承和多继承两种。
单继承
只有一个父类
1 | class A(object): |
多继承
有多个父类
1 | class A(object): |
注意:当一个类有多个父类的时候,默认使用第一个父类的同名属性和方法。
拓展:查看一个类的层级继承关系
1 | print(类.__mro__) |
子类调用父类同名方法和属性
通过师傅徒弟案例和学校的多继承完成演示(相应含义已在注释部分说明)
1 | # 师傅类 |
super()函数
1 | super().__init__() |
注意:使用super()可以自动查找父类。调用顺序遵循
__mro__
的类属性顺序。比较适合单继承使用。
私有权限
定义私有属性和方法
设置私有权限的方法:在属性名 和 方法名 前面 加上两个下划线__。
1 | def __init__(self): |
注意:私有属性和私有方法只能在类里面访问和修改
获取和修改私有属性
自定义get和set方法
1 | def get_money(self): |
保护权限
以单下划线开头。
其他
面向对象的三个特性
- 封装
- 将属性和方法书写到类里的操作
- 封装可以为属性和方法添加私有权限
- 继承
- 默认继承父类的所有属性和方法
- 子类可以重写父类的属性和方法
- 多态
- 传入不同的对象,产生不同的结果
多态
定义:多态是一种使用对象的方式,子类重写父类方法,调用不同子类对象的相同父类方法,可以产生不同的执行结果。
1 | class Dog(object): |
类属性和实例属性
设置和访问类属性
- 类属性就是 类对象 所拥有的属性,它被 该类的所有实例对象 所共有。
- 类属性可以使用 类对象 或 实例对象 访问。
1 | class Dog(object): |
类属性的优点:
- 记录的某项数据始终保持一致,则定义类属性。
- 实例属性要求 每个对象 *为其 单独开辟一份内存空间 来记录数据,而 *类属性 为全人类所共有,仅占用一份内存,更加节省内存空间。
修改类属性
类属性只能通过类对象修改,不能通过实例对象修改,如果通过实例对象修改类属性,表示的是创建了一个实例属性。
1 | # 修改实例属性 |
类方法和静态方法
类方法
特点
需要用装饰器
@classmethod
;来标识其为类方法,对于类方法,第一个参数必须为类对象,一半以cls
作为第一个参数。使用场景
当方法中需要使用类对象(如访问私有类属性等)时,定义类方法
类方法一般和类属性配合使用
1 | class Dog(object): |
静态方法
特点
需要通过装饰器
@staticmethod
来进行修饰,静态方法既不需要传递类对象,也不需要传递实例对象(形参没有self/cls)。静态方法也能通过 实例对象 和 类对象 去访问。
使用场景
当方法中既不需要使用实例对象,也不需要使用类对象时,定义静态方法。
取消不需要的参数传递,有利于 减少不必要的内存占用和性能消耗。
1 | class Dog(object): |