4.2 使用类和实例
可以使用类来模拟现实世界中的很多情景。类编写好后,程序的大部分时间都将花在使用根据类创建的实例上。你需要执行的一个重要任务是修改实例的属性。
4.2.1 示例:Car 类
编写一个表示汽车的类,它存储了有关汽车的信息,还有一个汇总这些信息的方法:
class Car():
'''模拟汽车'''
def __init__(self,make,model,year):
'''初始化汽车属性'''
self.make = make
self.model = model
self.year = model
def get_descriptive_name(self):
'''获取汽车的描述信息'''
long_name = str(self.year) + ' ' + self.make + ' ' + self.model
return long_name.title()
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
示例说明:
定义了方法__init__() 。与前面的Dog 类中一样,这个方法的第一个形参为self ;我们还在这个方法中包含了另外三个形参:make 、model 和year 。方法__init__() 接受这些形参的值,并将它们存储在根据这个类创建的实例的属性中。创建新的Car 实例时,我们需要指定其制造商、型号和生产年份。
定义了一个名为get_descriptive_name() 的方法,它使用属性year 、make 和model 创建一个对汽车进行描述的字符串,让我们无需分别打印每个属性的值。为在这个方法中访问属性的值,我们使用了self.make 、self.model 和self.year 。
根据Car 类创建了一个实例,并将其存储到变量my_new_car中。
接下来调用方法get_descriptive_name() ,指出我们拥有的是一辆什么样的汽车
4.2.2 给属性指定默认值
类中的每个属性都必须有初始值,哪怕这个值是0或空字符串。在有些情况下,如设置默认值时,在方法__init__() 内指定这种初始值是可行的;如果你对某个属性这样做了,就无需包含为它提供初始值的形参。
示例:在前面例子的基础上添加一个名为odometer_reading 的属性,其初始值总是为0。同时还添加了一个名为read_odometer() 的方法,用于读取汽车的里程表:
class Car():
'''模拟汽车'''
def __init__(self,make,model,year):
'''初始化汽车属性'''
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0 #定义新属性,初始值为0
def get_descriptive_name(self):
'''获取汽车的描述信息'''
long_name = str(self.year) + ' ' + self.make + ' ' + self.model
return long_name.title()
def read_odometer(self): #定义新方法
'''读取汽车的里程数'''
print("This car has " + str(self.odometer_reading) + " miles on it")
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()
4.2.3 修改属性的值
可以以三种不同的方式修改属性的值:
直接通过实例进行修改;
通过方法进行设置;
通过方法进行递增(增加特定的值)。
4.2.3.1 直接修改属性的值
要修改属性的值,最简单的方式是通过实例直接访问它。
示例:下面的代码直接将年份设置为2020,里程表读数设置为23:
my_new_car = Car('audi', 'a4', 2016)
my_new_car.year = 2020
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
4.2.3.2 通过方法修改属性的值
定义更新属性的方法,就无需直接访问属性,而可将值传递给一个方法,由它在内部进行更新。
下面的示例定义了update_year()和update_odometer() 的方法:
def update_year(self, year):
'''update year'''
self.year = year
def update_odometer(self, odometer):
'''update odameter'''
self.odometer_reading = odometer
以下为调用方式
my_new_car = Car('audi', 'a4', 2016)
my_new_car.update_year(2020)
my_new_car.update_odometer(23)
4.2.3.3 通过方法对属性的值进行递增
有时候需要将属性值递增特定的量,而不是将其设置为全新的值。
示例:里程数递增到里程表读数
def increment_odometer(self,odometer):
'''递增里程数'''
self.odometer_reading += odometer
my_new_car = Car('audi', 'a4', 2016)
my_new_car.increment_odometer(100)
my_new_car.increment_odometer(100)
my_new_car.read_odometer()
#里程数变为200