类
类的定义与使用
对象是某个具体存在的事物,例如,一个名叫“Jack"的学生就是一个对象。
与对象相比,类是抽象的,它是对一群具有相同特征和行为的事物的统称。例如,学校的学生,其特征包括”学号“”姓名“”性别“等,其行为包括”选课“”上课“”考试“等。类和对象之间的关系如下图所示:
tips:其实,字典的本质就是类。字典是用”{}“表示的,由”键-值“对这样的元素组成的,它还具有一些增、删、改、查的方法。但是我们并不知道字典里存储了哪些具体内容。所以,字典这个类型就是类,而某一个具体赋值的字典就是对象。
>>> dict # 查看字典类型
<class 'dict'>
>>> stu = dict(num='20180101',name='Liming',sex='male') # 创建类的对象
>>> stu.pop('name') # 执行stu的方法
'Liming'
类的定义
面向对象程序设计思想是把事物的特征和行为包含在类中。其中,事物的特征作为类的变量,事物的行为作为类的方法,而对象是类的一个实例。因此,要想创建一个对象需要先定义一个类。
定义类的基本语法格式如下:
class 类名:
类体
Python使用class关键字来定义类,class关键字后是一个空格,然后是类的名字,再后是一个冒号,最后换行并定义类的内部实现。
定义类时需要注意:
(1)类名的首字母一般需要大写,如Car.
(2)类体一般包括变量的定义和方法的定义
(3)类体相对于class关键字必须保持一定的空格缩进。
例如:
class Car:
# 定义变量
color = 'red'
price = 15000
# 定义方法
def run(self):
print('车正在行驶中...')
tips:从代码中可以看出,方法和函数是一样的,主要区别在于,方法必须显示地声明一个self参数,而且位于参数列表的开头。
创建类的对象
程序想要完成具体的功能,仅有类是远远不够的,还需要根据类来创建实例对象。
在Python中,创建对象的语法如下:
对象名 = 类名()
创建完对象后,可以使用它来访问类中的变量和方法,具体方法是:
对象名.类中的变量名
对象名.方法名([参数])
比如,拿上面的Car类举例:
benchi = Car() # 创建一个 奔驰 实例对象
print(benchi.color) # 访问Car类的color变量
benchi.run() # 访问Car类的run()方法
运行结果为:
red
车正在行驶中...
self参数
类的所有方法都必须至少有一个名为self的参数,并且必须是方法的第一个参数。
那么,self到底是什么?
如果把类比作是制造汽车的图纸,那么由类实例化的对象才是真正可以开的汽车。根据一张图纸可以设计出成千上万的汽车,它们都长得差不多,但它们都有各自不同的属性,如颜色不同、价格不同等。所以self就相当于每辆车的编号,有了self就可以轻松地找到对应的车了。
在Python中, 由同一个类可以生成无数个对象,当一个对象的方法被调用时,对象会将自身的引用作为第一个参数传递给该方法,那么Python就知道需要操作那个对象的方法了。
在类的方法中访问变量时,需要以self为前缀,但在外部通过对象名调用对象方法时不需要传递该参数。
下面通过实例进行说明:
# 定义类
class Car:
def colour(self,col): # 定义赋值颜色的方法
self.col = col # 赋值
def show(self): # 定义显示颜色的方法
print('The colour of the car is %s.'%self.col) # 输出颜色
car_1 = Car() # 创建对象car_1
car_1.colour('red') # 调用方法
car_2 = Car() # 创建对象car_2
car_2.colour('white') # 调用方法
car_1.show() # 调用方法
car_2.show() # 调用方法
运行结果:
The colour of the car is red.
The colour of the car is white.
tips:Python中,在类中定义方法时将第一个参数命名为self只是一个习惯,而实际上名字是可以改变的。但一般不建议这样做,因为这样做代码可读性会变差。
>>> class A:
def show(my): # 第一个参数命名为my
print("hello")
>>> a = A()
>>> a.show()
hello
构造方法
Python中构造方法的固定名称为__init__()
,当创建类的对象时,系统会自动调用构造方法,从而实现对对象进行初始化的操作。
例如:
class Car:
def __init__(self): # Car类的构造方法
print('Car的构造方法运行了')
byd = Car()
运行结果:
Car的构造方法运行了
从上述代码很明显地能够看出,当实例化对象时系统自动调用了构造方法里面的内容。这就是python的构造方法,Are you got it?
析构方法
创建对象时,Python解释器默认会调用构造方法;当需要删除一个对象来释放所占的资源时,Python解释器会调用另一个方法,这个方法就是析构方法。
析构方法的固定名称为__del__()
,程序结束时会自动调用该方法,也可以使用del语句手动调用该方法删除对象。
class A:
def __init__(self):
print('构造方法被调用')
def __del__(self):
print('析构方法被调用')
a = A()
print('创建对象后第一行代码运行')
print('创建对象后第二行代码运行')
print('创建对象后第三行代码运行')
print('程序结束')
运行结果:
构造方法被调用
创建对象后第一行代码运行
创建对象后第二行代码运行
创建对象后第三行代码运行
程序结束
析构方法被调用
上述代码很显著地将析构方法的特点展示出来。创建A的实例化对象a后系统自动调用了构造方法,然后将后面的程序执行完之后系统自动调用A里面的析构方法__del__()
。
当运用del语句删除对象时:
class A:
def __init__(self):
print('构造方法被调用')
def __del__(self):
print('析构方法被调用')
a = A()
del a # 手动调用析构方法
print('创建对象后第一行代码运行')
print('创建对象后第二行代码运行')
print('创建对象后第三行代码运行')
print('程序结束')
运行结果:
构造方法被调用
析构方法被调用
创建对象后第一行代码运行
创建对象后第二行代码运行
创建对象后第三行代码运行
程序结束
上述代码在创建a对象后就将其删除,这时del a
语句起作用将对象a删除,因此之后__del__()
方法就不会再次执行。