类的定义与使用

对象是某个具体存在的事物,例如,一个名叫“Jack"的学生就是一个对象。

与对象相比,是抽象的,它是对一群具有相同特征和行为的事物的统称。例如,学校的学生,其特征包括”学号“”姓名“”性别“等,其行为包括”选课“”上课“”考试“等。类和对象之间的关系如下图所示:

image

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__()方法就不会再次执行。

posted @ 2021-11-14 11:56  Cara_Smith  阅读(293)  评论(0编辑  收藏  举报