(22)python类(2)

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

你可能感兴趣的:((22)python类(2))