前言:面向?qū)ο缶幊?。類是一大類對象都有的通用行為?;陬悇?chuàng)建對象時,每個對象都自動具備這種通用行為。根據(jù)類來創(chuàng)建對象被稱為實(shí)例化。
9.1 創(chuàng)建和使用類
類幾乎可以模擬任何東西
9.1.1 創(chuàng)建dog類
class Dog(): #首字母大寫的名稱
"""一次模擬小狗的簡單嘗試"""
def _init_(self,name,age): #類中的函數(shù)稱為方法
"""初始化屬性name和age"""
self.name = name # 可以通過實(shí)例訪問的變量稱為屬性
self.age = age
def sit(self):
"""模擬小狗被命令蹲下"""
print(self.name.title() + ' is now sitting.')
def roll_over(self):
"""模擬小狗被命令打滾"""
print(self.name.title() + ' is rolled over!')
9.1.2 根據(jù)類創(chuàng)建實(shí)例
class Dog(): #首字母大寫的名稱
"""一次模擬小狗的簡單嘗試"""
def __init__(self,name,age): #類中的函數(shù)稱為方法 init方法前后都有2個下劃線
"""初始化屬性name和age"""
self.name = name # 可以通過實(shí)例訪問的變量稱為屬性
self.age = age
def sit(self):
"""模擬小狗被命令蹲下"""
print(self.name.title() + ' is now sitting.')
def roll_over(self):
"""模擬小狗被命令打滾"""
print(self.name.title() + ' is rolled over!')
my_dog = Dog('willie',6) #實(shí)例1
print("my dog's name is " + my_dog.name.title() + ".") # 訪問屬性,使用句點(diǎn)表示法
print("my dog is " + str(my_dog.age) + " years old.")
my_dog.sit()#調(diào)用方法,句點(diǎn)表示法
your_dog = Dog("lucy",3)#實(shí)例2
print("your dog's name is " + your_dog.name.title() + ".") # 訪問屬性,使用句點(diǎn)表示法
print("your dog is " + str(your_dog.age) + " years old.")
your_dog.roll_over()
9.2 使用類和實(shí)例
9.2.1 Car 類
class Car():
def __init__(self,make,model,year):
"""初始化描述汽車屬性"""
self.make = make
self.model = model
self.year = year
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())
9.2.2 給屬性指定默認(rèn)值
類的每個屬性都必須有初始值。
class Car():
def __init__(self,make,model,year):
"""初始化描述汽車屬性"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0 #添加屬性,并設(shè)置初始值總是0
def get_descriptive_name(self):
"""返回整潔的描述性信息"""
long_name = str(self.year) + " " + self.make + " " + self.model
return long_name.title()
def read_odometer(self): #定義方法
"""打印一條指出汽車?yán)锍痰南?""
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()
9.2.3 修改屬性的值
- 直接修改屬性的值:通過實(shí)例直接訪問
class Car():
def __init__(self,make,model,year):
"""初始化描述汽車屬性"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0 #添加屬性,并設(shè)置初始值總是0
def get_descriptive_name(self):
"""返回整潔的描述性信息"""
long_name = str(self.year) + " " + self.make + " " + self.model
return long_name.title()
def read_odometer(self): #定義方法
"""打印一條指出汽車?yán)锍痰南?""
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.odometer_reading = 23 #通過實(shí)例直接修改屬性的值
my_new_car.read_odometer()
- 通過方法修改屬性的值
class Car():
def __init__(self,make,model,year):
"""初始化描述汽車屬性"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0 #添加屬性,并設(shè)置初始值總是0
def get_descriptive_name(self):
"""返回整潔的描述性信息"""
long_name = str(self.year) + " " + self.make + " " + self.model
return long_name.title()
def read_odometer(self): #定義方法
"""打印一條指出汽車?yán)锍痰南?""
print("this car has " + str(self.odometer_reading)+ " miles on it.")
def update_odometer(self,mileage):#通過方法修改屬性的值
"""將里程表讀數(shù)設(shè)置為指定的值"""
self.odometer_reading = mileage
my_new_car = Car("audi",'a4',2016)
print(my_new_car.get_descriptive_name())
my_new_car.update_odometer(23)
my_new_car.read_odometer()
- 通過方法對屬性的值進(jìn)行遞增
class Car():
def __init__(self,make,model,year):
"""初始化描述汽車屬性"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0 #添加屬性,并設(shè)置初始值總是0
def get_descriptive_name(self):
"""返回整潔的描述性信息"""
long_name = str(self.year) + " " + self.make + " " + self.model
return long_name.title()
def read_odometer(self): #定義方法
"""打印一條指出汽車?yán)锍痰南?""
print("this car has " + str(self.odometer_reading)+ " miles on it.")
def update_odometer(self,mileage):#通過方法修改屬性的值
"""將里程表讀數(shù)設(shè)置為指定的值"""
self.odometer_reading = mileage
def increment_odometer(self,miles): #屬性值遞增特定的量
"""將里程表讀數(shù)增加指定的量"""
self.odometer_reading += miles
my_used_car = Car('subaru','outback',2013)
print(my_used_car.get_descriptive_name())
my_used_car.update_odometer(23500)
my_used_car.read_odometer()
my_used_car.increment_odometer(100)
my_used_car.read_odometer()
9.3 繼承
如果要編寫的類時另一個現(xiàn)成的類的特殊版本,可使用繼承。一個類繼承另一個類時,自動獲得另一個類的屬性和方法。原有的類稱為父類,而新類稱為子類。子類繼承了父類的屬性和方法,還可以定義自己的屬性和方法。
9.3.1 子類的方法init()
class Car(): #創(chuàng)建子類時,父類必須包含在當(dāng)前文件中,且位于子類的前面
def __init__(self,make,model,year):
"""初始化描述汽車屬性"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0 #添加屬性,并設(shè)置初始值總是0
def get_descriptive_name(self):
"""返回整潔的描述性信息"""
long_name = str(self.year) + " " + self.make + " " + self.model
return long_name.title()
def read_odometer(self): #定義方法
"""打印一條指出汽車?yán)锍痰南?""
print("this car has " + str(self.odometer_reading)+ " miles on it.")
def update_odometer(self,mileage):#通過方法修改屬性的值
"""將里程表讀數(shù)設(shè)置為指定的值"""
self.odometer_reading = mileage
def increment_odometer(self,miles): #屬性值遞增特定的量
"""將里程表讀數(shù)增加指定的量"""
self.odometer_reading += miles
class ElectricCar(Car): #定義子類時,必須在括號內(nèi)指定父類的名稱
def __init__(self,make,model,year):
"""初始化父類的屬性"""
super().__init__(make,model,year) #super()是一個特殊的函數(shù),用于關(guān)聯(lián)父類和子類(父類也稱superclass)
my_tesla = ElectricCar('tesla','model s', 2016)
print(my_tesla.get_descriptive_name())
9.3.3 給子類定義屬性和方法
添加區(qū)分子類和父類所需的新屬性和方法
class Car(): #創(chuàng)建子類時,父類必須包含在當(dāng)前文件中,且位于子類的前面
def __init__(self,make,model,year):
"""初始化描述汽車屬性"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0 #添加屬性,并設(shè)置初始值總是0
def get_descriptive_name(self):
"""返回整潔的描述性信息"""
long_name = str(self.year) + " " + self.make + " " + self.model
return long_name.title()
def read_odometer(self): #定義方法
"""打印一條指出汽車?yán)锍痰南?""
print("this car has " + str(self.odometer_reading)+ " miles on it.")
def update_odometer(self,mileage):#通過方法修改屬性的值
"""將里程表讀數(shù)設(shè)置為指定的值"""
self.odometer_reading = mileage
def increment_odometer(self,miles): #屬性值遞增特定的量
"""將里程表讀數(shù)增加指定的量"""
self.odometer_reading += miles
class ElectricCar(Car): #定義子類時,必須在括號內(nèi)指定父類的名稱
def __init__(self,make,model,year):
"""初始化父類的屬性"""
super().__init__(make,model,year) #super()是一個特殊的函數(shù),用于關(guān)聯(lián)父類和子類(父類也稱superclass)
self.battery_size = 70 #給子類添加有別有父類的屬性
def describe_battery(self):
print("this car has a " + str(self.battery_size) + "-keh battery.")
my_tesla = ElectricCar('tesla','model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
9.3.4 重寫父類的方法
在子類中定義與父類方法同名的方法。
9.3.5 將實(shí)例用作屬性
可以將類的一部分作為一個獨(dú)立的類提取出來,將大類拆成多個協(xié)同工作的小類
class Car(): #創(chuàng)建子類時,父類必須包含在當(dāng)前文件中,且位于子類的前面
def __init__(self,make,model,year):
"""初始化描述汽車屬性"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0 #添加屬性,并設(shè)置初始值總是0
def get_descriptive_name(self):
"""返回整潔的描述性信息"""
long_name = str(self.year) + " " + self.make + " " + self.model
return long_name.title()
def read_odometer(self): #定義方法
"""打印一條指出汽車?yán)锍痰南?""
print("this car has " + str(self.odometer_reading)+ " miles on it.")
def update_odometer(self,mileage):#通過方法修改屬性的值
"""將里程表讀數(shù)設(shè)置為指定的值"""
self.odometer_reading = mileage
def increment_odometer(self,miles): #屬性值遞增特定的量
"""將里程表讀數(shù)增加指定的量"""
self.odometer_reading += miles
class Battery():
def __init__(self,battery_size = 70):
self.battery_size = battery_size
def describe_battery(self):
print("this car has a " + str(self.battery_size) + "-kwh battery.")
def get_range(self):
if self.battery_size == 70:
range = 240
elif self.battery_size == 85:
range - 270
msg = "this car can go approximately "+str(range)
msg += "miles on a full charge"
print(msg)
class ElectricCar(Car): #定義子類時,必須在括號內(nèi)指定父類的名稱
def __init__(self,make,model,year):
"""初始化父類的屬性"""
super().__init__(make,model,year) #super()是一個特殊的函數(shù),用于關(guān)聯(lián)父類和子類(父類也稱superclass)
self.battery = Battery()
my_tesla = ElectricCar('tesla','model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()
9.3.6 模擬實(shí)物
從較高的邏輯層面而不是語法層面考慮。應(yīng)該考慮如何用代碼來表示實(shí)物?,F(xiàn)實(shí)世界的建模沒有對錯之分,有的方法效率更高。
9.4 導(dǎo)入類
9.4.1 導(dǎo)入單個類
將類存儲在獨(dú)立的模塊中,再導(dǎo)入,保持主程序的征集
9.4.2 在一個模塊中存儲多個類
9.4.3 從一個模塊中導(dǎo)入多個類
from module_name import class_name1,class_name2 #逗號隔開
9.4.5 導(dǎo)入模塊中的所有類
from module_name import *