第10章 面向对象
10.1 对象与类
在现实世界中,随处可见的一种事物就是对象,对象是事物存在的实体,如学生、汽车等。人类解决问题的方式总是将复杂的事物简单化,于是就会思考这些对象都是由哪些部分组成的。通常都会将对象划分为两个部分,即静态部分与动态部分。顾名思义,静态部分就是不能动的部分,这个部分被称为“属性”,任何对象都会具备其自身属性,如一个人,其属性包括高矮、胖瘦、年龄、性别等。然而具有这些属性的人会执行哪些动作也是一个值得探讨的部分,这个人可以转身、微笑、说话、奔跑,这些是这个人具备的行为(动态部分),人类通过探讨对象的属性和观察对象的行为来了解对象。
10.2 类的定义
Python使用class关键字来定义类,其语法格式如下:
其中,实例方法与前面学习的函数格式类似,区别在于类的所有实例方法都必须至少有一个名为self的参数,并且必须是方法的第一个形参(如果有多个形参),self参数代表将来要创建的对象本身。另外,self.name称为实例属性,在类的实例方法中访问实例属性时需要以self为前缀。
10.3 对象的创建
10.3.1 类对象
类对象是在执行class语句时创建的,如例所示。
10.3.2 实例对象
实例对象通过调用类对象来创建(就像调用函数一样来调用类对象),每个实例对象继承类对象的属性,并获得自己的命名空间。实例方法的第一个参数默认为self,表示引用实例对象。在实例方法中对self的属性赋值才会创建属于实例对象的属性,如例所示。
10.4 构造方法
Python中构造方法一般用来为实例属性设置初值或进行其他必要的初始化操作,在创建实例对象时被自动调用和执行,如例所示。
上例中创建实例对象时,默认给school属性赋值为’千锋教育’。如果在创建实例对象时,由用户指定school属性的值,则可以在构造方法中添加额外参数,如例所示。
10.5 析构方法
析构方法一般用来释放对象占用的资源,在删除对象和收回对象空间时被自动调用和执行,如例所示。
10.6 类方法
类方法是类所拥有的方法,通过修饰器@classmethod在类中定义,其语法格式如下:
10.7 静态方法
其中,@staticmethod为装饰器,参数列表中可以没有参数。静态方法可以访问类属性,但不可以访问实例属性,如例所示。
10.8 运算符重载
在Python中可通过运算符重载来实现对象之间的运算,如字符串可以进行如下运算:
10.8.1 算术运算符重载
定义一个复数类并对其进行算术运算符重载,如例所示。
10.8.2 比较运算符重载
定义一个复数类并对其进行比较运算符重载,如例所示。
10.8.3 字符串表示重载
当对象作为print()、str()函数的参数时,该对象会调用重载的__str__()方法,如例所示。
10.8.4 索引或切片重载
当对实例对象执行索引、分片或for迭代时,该对象会调用重载的__getitem__()方法,如例所示。
10.8.5 检查成员重载
当对实例对象执行检查成员时,该对象会调用重载的__contains__()方法,如例所示。