Python爬虫、数据分析与可视化:工具详解与案例实战
上QQ阅读APP看书,第一时间看更新

3.2.1 创建类并在类里封装属性和方法

在Python语法里,通过class来创建新类,在定义好类名之后以冒号结尾。类的主要功能是封装,所以在其中可以封装相关的属性和方法。在如下的CarClassDemo.py案例中,我们将演示创建和使用类的做法。


01 # coding=utf-8
02 class Car:
03     # 定义属性
04     price = 0
05     owner = ''
06     # 私有属性,是否保险
07     __Insured = False
08     # 构造方法,这是一个魔术方法
09     def __init__(self, price, owner):
10         self.price = price
11         self.owner = owner
12     # 输出信息的方法
13     def printInfo(self):
14         print('Owner is:' + self.owner)
15         print('price is:' + str(self.price))
16 # 实例化类并使用
17 myCar = Car(250000,'Peter')
18 # Owner is:Peter
19 # price is:250000
20 myCar.printInfo()
21 print(myCar.owner) # Peter
22 # print(myCar.__Insured) # error

从第2行到第15行,我们通过class关键字定义了一个名为Car的类。在第4行和第5行里,定义了Car里的价格(price)和拥有者(owner)这两个公有属性。在第7行里,通过__前缀定义了“是否保险”的私有属性。在第9行里,我们定义了名为__init__的构造函数。这是一个魔术方法,具体来讲,当创建类时,这个方法会自动执行,并且我们用入参给类里的两个属性进行了赋值。在第13行里,我们定义了Car类里的printInfo方法,输出了Car的两个属性。

在第17行里,我们实例化了Car类,并把实例化后的结果赋给了myCar对象。在第20行里,通过myCar调用了printInfo方法(第18行和第19行的注释里给出了打印结果)。而在第21行里,我们通过myCar对象输出了owner值。由于__Insured属性是私有的,因此无法通过myCar对象输出,也就是说第22行的代码会报错。

下面我们来归纳一下关于类和对象的使用要点:

第一,务必理解类和实例对象的差别。以本代码为例,汽车类是一个抽象的类,而属于Peter的汽车是一个实例对象。再具体点,只有调用实例的方法才有意义,比如通过调用printInfo方法输出Peter的汽车这个实例的信息才有用,而输出汽车类的printInfo方法毫无意义,因为汽车类是一个抽象的概念。

第二,在使用过程中,一般会如第17行那样初始化类的实例,同时会在__init__这个魔术方法里定义初始化类时的动作,因为该方法会在实例化类时被调用。

第三,在类里可以定义公有、私有的属性和方法,公有属性和公有方法能被实例化对象使用,而私有方法和私有属性不能。

第四,在类里会用self参数来表示实例,以此使用类里的属性或方法,比如在第14行就是通过self.owner来使用owner属性的。