# _*_ coding:utf-8 _*_
"""
name:zhangxingzai
date:2022/11/17
from:《Python编程从入门到实践》
"""
9.1 创建和使⽤类
使⽤类⼏乎可以模拟任何东⻄。下⾯来编写⼀个表⽰⼩狗的简单类Dog ,它表⽰的
不是特定的⼩狗,⽽是任何⼩狗。对于⼤多数宠物狗,我们都知道些什么呢?它们
都有名字和年龄。我们还知道,⼤多数⼩狗还会蹲下和打滚。由于⼤多数⼩狗都具
备上述两项信息(名字和年龄)和两种⾏为(蹲下和打滚),我们的Dog 类将包含
它们。这个类让Python知道如何创建表⽰⼩狗的对象。编写这个类后,我们将使⽤
它来创建表⽰特定⼩狗的实例。
9.1.1 创建类
定义⼀个名为Dog 的类。根据约定,在Python中,⾸字⺟⼤写的名称指的是类。这个类定义中没有圆括号,因为要从空⽩创建这个类。
class Dog:
"""⼀次模拟⼩狗的简单尝试。"""
def __init__(self, name, age):
"""初始化属性name和age。"""
self.name = name
self.age = age
'''
self.name = name 获取与形参name 相关联
的值,并将其赋给变量name ,然后该变量被关联到当前创建的实例。self.age =
age 的作⽤与此类似。像这样可通过实例访问的变量称为属性 。
'''
def sit(self):
"""模拟⼩狗收到命令时蹲下。"""
print(f"{self.name} is now sitting.")
def roll_over(self):
"""模拟⼩狗收到命令时打滚。"""
print(f"{self.name} rolled over!")
9.1.2 根据类创建实例
my_dog = Dog('Willie', 6)
your_dog = Dog('Lucy', 3)
print(f"My dog's name is {my_dog.name}.")
print(f"My dog is {my_dog.age} years old.")
my_dog.sit()
print(f"\nYour dog's name is {your_dog.name}.")
print(f"Your dog is {your_dog.age} years old.")
your_dog.sit()
9.2 使⽤类和实例
9.2.1 下⾯来编写⼀个表⽰汽⻋的类。它存储了有关汽⻋的信息,还有⼀个汇总这些信息的⽅法:
class Car:
"""⼀次模拟汽⻋的简单尝试。"""
def __init__(self, make, model, year):
"""初始化描述汽⻋的属性。"""
self.make = make
self.model = model
self.year = year
'''
定义了⽅法__init__() 。与前⾯的Dog 类中⼀样,这个⽅法的第⼀个形参
为self 。该⽅法还包含另外三个形参:make 、model 和year 。⽅法__init__()
接受这些形参的值,并将它们赋给根据这个类创建的实例的属性。创建新的Car 实
例时,需要指定其制造商、型号和⽣产年份。
'''
def get_descriptive_name(self):
"""返回整洁的描述性信息。"""
long_name = f"{self.year} {self.make} {self.model}"
return long_name.title()
my_new_car = Car('audi', 'a4', 2019)
print(my_new_car.get_descriptive_name())
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_descriptive_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_descriptive_name())
my_new_car.read_odometer()
9.2.3 修改属性的值
我们能以三种⽅式修改属性的值:直接通过实例进⾏修改,通过⽅法进⾏设置,以
及通过⽅法进⾏递增(增加特定的值)。下⾯依次介绍这些⽅式。
a. 直接修改属性的值
要修改属性的值,最简单的⽅式是通过实例直接访问它。下⾯的代码直接将⾥程表读数设置为23:
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
b. 通过⽅法修改属性的值
如果有⽅法能替你更新属性,将⼤有裨益。这样就⽆须直接访问属性,⽽可将值传递给⽅法,由它在内部进⾏更新。
class Car:
def __init__(self, make, model, year):
"""初始化描述汽⻋的属性。"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
def get_descriptive_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_descriptive_name())
my_new_car.update_odometer(24)
my_new_car.read_odometer()
c. 通过⽅法对属性的值进⾏递增
有时候需要将属性值递增特定的量,⽽不是将其设置为全新的值。假设我们购
买了⼀辆⼆⼿⻋,且从购买到登记期间增加了100英⾥的⾥程。下⾯的⽅法让
我们能够传递这个增量,并相应地增⼤⾥程表读数:
class Car:
def __init__(self, make, model, year):
"""初始化描述汽⻋的属性。"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
def get_descriptive_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
def increment_odometer(self, miles):
"""将⾥程表读数增加指定的量。"""
self.odometer_reading += miles
my_used_car = Car('subaru', 'outback', 2015)
print(my_used_car.get_descriptive_name())
my_used_car.update_odometer(23_500)
my_used_car.read_odometer()
my_used_car.increment_odometer(100)
my_used_car.read_odometer()