4.2 使用類和實例
可以使用類來模擬現(xiàn)實世界中的很多情景。類編寫好后,程序的大部分時間都將花在使用根據(jù)類創(chuàng)建的實例上。你需要執(zhí)行的一個重要任務是修改實例的屬性。
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__() 接受這些形參的值,并將它們存儲在根據(jù)這個類創(chuàng)建的實例的屬性中。創(chuàng)建新的Car 實例時,我們需要指定其制造商、型號和生產(chǎn)年份。
? 定義了一個名為get_descriptive_name() 的方法,它使用屬性year 、make 和model 創(chuàng)建一個對汽車進行描述的字符串,讓我們無需分別打印每個屬性的值。為在這個方法中訪問屬性的值,我們使用了self.make 、self.model 和self.year 。
? 根據(jù)Car 類創(chuàng)建了一個實例,并將其存儲到變量my_new_car中。
? 接下來調(diào)用方法get_descriptive_name() ,指出我們擁有的是一輛什么樣的汽車
4.2.2 給屬性指定默認值
類中的每個屬性都必須有初始值,哪怕這個值是0或空字符串。在有些情況下,如設置默認值時,在方法__init__() 內(nèi)指定這種初始值是可行的;如果你對某個屬性這樣做了,就無需包含為它提供初始值的形參。
示例:在前面例子的基礎上添加一個名為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):? ? #定義新方法
? ? ? ? '''讀取汽車的里程數(shù)'''
? ? ? ? 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,里程表讀數(shù)設置為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 通過方法修改屬性的值
定義更新屬性的方法,就無需直接訪問屬性,而可將值傳遞給一個方法,由它在內(nèi)部進行更新。
下面的示例定義了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
以下為調(diào)用方式
my_new_car = Car('audi', 'a4', 2016)
my_new_car.update_year(2020)
my_new_car.update_odometer(23)
4.2.3.3 通過方法對屬性的值進行遞增
有時候需要將屬性值遞增特定的量,而不是將其設置為全新的值。
示例:里程數(shù)遞增到里程表讀數(shù)
def increment_odometer(self,odometer):
? ? '''遞增里程數(shù)'''
? ? 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()
#里程數(shù)變?yōu)?00