蟒蛇书学习笔记——Chapter 09 Section 02 使用类和实例 【第九章 2/3】

9.2 使用类和实例

  可使用类来模拟现实世界中的很多情景。

  类编写好后,你的大部分时间将花在根据类创建的实例上。你需要执行的一个重要任务是修改实例的属性

  可以直接修改实例的属性,也可以编写方法以特定的方式进行修改。

9.2.1 Car类

  下面来准备一个Car类,它存储了有关汽车的信息,还有一个汇总这些信息的方法:

class CarDemo:
    """一次模拟汽车的简单尝试。"""
    
    def __init__(self, make, model, year):
        """初始化描述车的属性(制造商、型号和生产年份)"""
        self.make = make
        self.model = model
        self.year = year
        
    def get_describtive_name(self):
        """返回简洁的描述性信息"""
        long_name = f"{self.year} {self.make} {self.model}."
        return long_name.title()

my_new_democar = CarDemo('Audi', 'a4', '2019')
print(my_new_democar.get_describtive_name())

output:

2019 Audi A4.

  为了让这个类更有趣,下面给它添加一个随时间变化的属性,用于存储汽车的总里程。

9.2.2 给属性指定默认值

  创建实例时,有些属性无须通过形参来定义,可在方法__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
        
    def get_describtive_name(self):
        """返回简洁的描述性信息"""
        long_name = f"{self.year} {self.make} {self.model}."
        return long_name.title()
    
    def read_odometer(self):
        """打印一条指出车总里程的信息"""
        print(f"This car has {self.odometer_reading} miles on it.")

my_new_car = Car('Audi', 'a4', '2019')
print(my_new_car.get_describtive_name())
my_new_car.read_odometer()

output:

2019 Audi A4.
This car has 0 miles on it.

此处里程的单位为英里(mile) , 1英里 ≈ 1.6千米。 ——蟒蛇书编者注
  出售时里程表读数为0的汽车不多,因此需要一种方式来修改该属性的值。

9.2.3 修改属性的值

  我们能以三种方式修改属性的值:直接通过实例进行修改,通过方法进行设置,以及通过方法进行递增(增加特定的值)。

  a. 通过实例直接修改属性

my_new_car.odometer_reading = 23
my_new_car.read_odometer()

output:

This car has 23 miles on it.

  b. 通过方法修改属性的值

  如果有方法能替你更新属性,将大有裨益。这样就无须直接访问属性,而可将值传递给方法,由它在内部进行更新。

  下面的示例演示了一个名为update_odometer()的方法:

class Car:
    
    def __init__(self, make, model, year):
        """初始化描述车的属性(制造商、型号、生产年份和总里程)"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0
        
    def get_describtive_name(self):
        """返回简洁的描述性信息"""
        long_name = f"{self.year} {self.make} {self.model}."
        return long_name.title()
    
    def read_odometer(self):
        """打印一条指出车总里程的信息"""
        print(f"This car has {self.odometer_reading} miles on it.")
        
    def update_odometer(self, mileage):
        """将里程表读数设置成任意值"""
        self.odometer_reading = mileage

my_new_car = Car('Audi', 'a4', '2019')
print(my_new_car.get_describtive_name())

my_new_car.update_odometer(23)
my_new_car.read_odometer()

output:

2019 Audi A4.
This car has 23 miles on it.

  可对方法update_odometer()进行扩展,使其在修改里程表读数时做些额外的工作。

  下面来添加一些逻辑,禁止任何人将里程表读数往回调:

class Car:
    
    def __init__(self, make, model, year):
        """初始化描述车的属性(制造商、型号、生产年份和总里程)"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0
        
    def get_describtive_name(self):
        """返回简洁的描述性信息"""
        long_name = f"{self.year} {self.make} {self.model}."
        return long_name.title()
    
    def read_odometer(self):
        """打印一条指出车总里程的信息"""
        print(f"This car has {self.odometer_reading} miles on it.")
        
    def update_odometer(self, mileage):
        """
        将里程表读数设置成任意值
        禁止将里程表读数往回调。
        """
        if mileage >= self.read_odometer:
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")

  c. 通过方法对属性的值进行递增

  下面的方法让我们能够传递这个增量,并相应地增大里程表读数:

class Car:
    
    def __init__(self, make, model, year):
        """初始化描述车的属性(制造商、型号、生产年份和总里程)"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0
        
    def get_describtive_name(self):
        """返回简洁的描述性信息"""
        long_name = f"{self.year} {self.make} {self.model}."
        return long_name.title()
    
    def read_odometer(self):
        """打印一条指出车总里程的信息"""
        print(f"This car has {self.odometer_reading} miles on it.")
        
    def update_odometer(self, mileage):
        """
        将里程表读数设置成任意值
        禁止将里程表读数往回调。
        """
        if mileage >= self.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")
            
    def increment_odometer(self, miles):
        """将里程表读数增加指定的量。 """
        self.odometer_reading += miles

my_used_car = Car('sabaru', 'outback', 2015)
print(my_used_car.get_describtive_name())

my_used_car.update_odometer(23_500)
my_used_car.read_odometer()

my_used_car.increment_odometer(100)
my_used_car.read_odometer()

output:

2015 Sabaru Outback.
This car has 23500 miles on it.
This car has 23600 miles on it.

习题:

  新增的方法increment_odometer()接受一个单位为英里的数,并将其加入self.odometer_reading中。

  创建一辆二手车my_used_car。调用方法update_odometer()并传入23_500,将这辆二手车的里程表读数设置为23 500。

  调用increment_odometer()并传入100,以增加从购买到登记期间行驶的100英里:

posted @ 2022-02-17 12:21  姜子牙会更好  阅读(56)  评论(0编辑  收藏  举报