Python3 基础学习笔记 C08 【类】
CSDN 課程推薦:《8小時Python零基礎輕松入門》,講師齊偉,蘇州研途教育科技有限公司CTO,蘇州大學應用統計專業碩士生指導委員會委員;已出版《跟老齊學Python:輕松入門》《跟老齊學Python:Django實戰》、《跟老齊學Python:數據分析》和《Python大學實用教程》暢銷圖書。
Python3 基礎學習筆記第八章【類】
目錄
- 【8.1】創建類和使用類
- 【8.2】根據類創建實例
- 【8.3】使用類和實例
- 【8.3.1】給屬性指定默認值
- 【8.3.2】修改屬性的值
- 【8.4】繼承
- 【8.4.1】子類的方法__init__()
- 【8.4.2】Python 2.7 中的繼承
- 【8.4.3】給子類定義屬性和方法
- 【8.4.4】重寫父類的方法
- 【8.4.5】將實例用作屬性
- 【8.5】導入類
- 【8.5.1】導入單個類
- 【8.5.2】在一個模塊中儲存多個類
- 【8.5.3】從一個模塊中導入多個類
- 【8.5.4】導入整個模塊
- 【8.5.5】導入模塊中的所有類
- 【8.5.6】在一個模塊中導入另一個模塊
- 【8.6】Python標準庫
【8.1】創建類和使用類
創建一個表示小狗的簡單類Dog,根據Dog類創建的每個實例都將儲存名字和年齡,賦予每條小狗蹲下(sit())和打滾(roll_over())的能力:
class Dog():def __init__(self,name,age):#初始化屬性name和ageself.name = nameself.age = agedef sit(self):#模擬小狗被命令時蹲下print(self.name.title() + " is now sitting.")def roll_over(self):#模擬小狗被命令時打滾print(self.name.title() + " rolled over!")方法__init__():類中的函數稱為方法,本例中方法__init__()是一個特殊的方法,每當我們根據Dog類創建新實例時,Python都會自動運行它,在方法的名稱中,開頭和結尾各有兩個下劃線,這是一種約定,避免Python默認方法與普通方法發生名稱沖突,例子中將方法__init__()定義成了包含三個形參:self、name和age,在這個方法的定義中,形參self必不可少,還必須位于其他形參的前面,Python調用方法__init__()來創建Dog實例時,將自動傳入實參self,每個與類相關聯的方法調用都自動傳遞實參self,它是一個指向實例本身的引用,讓實例能夠訪問類中的屬性和方法,我們創建Dog實例時,Python將調用Dog類的方法__init__(),我們將通過實參向Dog()傳遞名字和年齡;self會自動傳遞,因此我們不需要傳遞它,每當我們根據Dog類創建實例時,都只需要給最后兩個形參(name和age)提供值;定義的兩個變量都有前綴self,以self為前綴的變量都可以供類中的所有方法使用,還可以通過類的任何實例來訪問這些變量。self.name = name 獲取儲存在形參name中的值,并將其儲存到變量name中,然后該變量被關聯到當前創建的實例。self.age = age 的作用與此類似,像這樣可通過實例訪問的變量稱為屬性;Dog還定義了另外兩種方法:sit() 和 roll_over() ,由于這些方法不需要額外的信息,如名字和年齡,因此它們只有一個形參self
在Python 2.7中創建類時,需要在括號內包含單詞object:
class ClassName(object):---snip---【8.2】根據類創建實例
● 訪問屬性:創建一個表示特定小狗的實例:
class Dog():def __init__(self,name,age):#初始化屬性name和ageself.name = nameself.age = agedef sit(self):#模擬小狗被命令時蹲下print(self.name.title() + " is now sitting.")def roll_over(self):#模擬小狗被命令時打滾print(self.name.title() + " rolled over!")my_dog = Dog('willie',6) print("My dog's name is " + my_dog.name.title() + ".") print("My dog is " + str(my_dog.age) + " years old.")讓Python創建一條名字為’willie’,年齡為6的小狗,Python使用實參’willie’和6調用Dog類中的方法__init__()。方法__init__()創建一個表示特定小狗的示例,并使用我們提供的值來設置屬性name和age;在訪問實例的屬性時,可使用句點表示法,比如該例子中的 my_dog.name;最終程序輸出結果如下:
My dog's name is Willie. My dog is 6 years old.● 調用方法:根據Dog類創建實例后,就可以使用句點表示法來調用Dog類中定義的任何方法:
class Dog():def __init__(self,name,age):#初始化屬性name和ageself.name = nameself.age = agedef sit(self):#模擬小狗被命令時蹲下print(self.name.title() + " is now sitting.")def roll_over(self):#模擬小狗被命令時打滾print(self.name.title() + " rolled over!")my_dog = Dog('willie',6) my_dog.sit() my_dog.roll_over()輸出結果如下:
Willie is now sitting. Willie rolled over!● 創建多個實例:可按需求根據類創建任意數量的實例:
class Dog():def __init__(self,name,age):#初始化屬性name和ageself.name = nameself.age = agedef sit(self):#模擬小狗被命令時蹲下print(self.name.title() + " is now sitting.")def roll_over(self):#模擬小狗被命令時打滾print(self.name.title() + " rolled over!")my_dog = Dog('willie',6) your_dog = Dog('lucy',8)print("My dog's name is " + my_dog.name.title() + ".") print("My dog is " + str(my_dog.age) + " years old.") my_dog.sit()print("\nYour dog's name is " + your_dog.name.title() + ".") print("Your dog is " + str(your_dog.age) + " years old.") your_dog.roll_over()輸出結果如下:
My dog's name is Willie. My dog is 6 years old. Willie is now sitting.Your dog's name is Lucy. Your dog is 8 years old. Lucy rolled over!【8.3】使用類和實例
創建一個表示汽車的類,其中儲存了有關汽車的信息,還有一個匯總這些信息的方法:
class Car():def __init__(self,make,model,year):self.make = makeself.model = modelself.year = yeardef get_descriptive_name(self):long_name = str(self.year) + ' ' + self.make + ' ' +self.modelreturn long_name.title()my_new_car = Car('audi','a9','2018') print(my_new_car.get_descriptive_name())輸出結果如下:
2018 Audi A9【8.3.1】給屬性指定默認值
類中的每個屬性都必須有初始值,如果我們設置了默認值,就無需包含為它提供初始值的形參,下面為8.3的例子添加一個 odometer_reading 的屬性,其初值是0,添加一個 odometer_reading() 方法,用于讀取汽車的里程表:
class Car():def __init__(self,make,model,year):self.make = makeself.model = modelself.year = yearself.odometer_reading = 0def get_descriptive_name(self):long_name = str(self.year) + ' ' + self.make + ' ' +self.modelreturn long_name.title()def read_odomter(self):print("This car has " + str(self.odometer_reading) + " miles on it.")my_new_car = Car('audi','a9','2018') print(my_new_car.get_descriptive_name()) my_new_car.read_odomter()輸出結果如下:
2018 Audi A9 This car has 0 miles on it.【8.3.2】修改屬性的值
可以以三種不同的方式修改屬性的值:直接通過實例進行修改;通過方法進行設置;通過方法進行遞增(增加特定的值)
● 直接修改屬性的值:
要修改屬性的值,最簡單的方法就是通過實例直接訪問它,將8.3.1中的例子第7行代碼 self.odometer_reading = 0 改為 self.odometer_reading = 66,輸出結果如下:
● 通過方法修改屬性的值:
class Car():def __init__(self,make,model,year):self.make = makeself.model = modelself.year = yearself.odometer_reading = 0def get_descriptive_name(self):long_name = str(self.year) + ' ' + self.make + ' ' +self.modelreturn long_name.title()def read_odomter(self):print("This car has " + str(self.odometer_reading) + " miles on it.")def update_odometer(self,mileage):self.odometer_reading = mileagemy_new_car = Car('audi','a9','2018') print(my_new_car.get_descriptive_name())my_new_car.update_odometer(66) my_new_car.read_odomter()對Car類所做的唯一修改就是在第17、18行添加了方法 update_odometer(),這個方法接受一個里程值,并將其儲存到 self.odometer_reading 中,在倒數第二行,調用了 update_odometer(),并向它提供了一個實參(該實參對應于方法定義中的形參mileage),它將里程數設置為66,而方法 read_odomter() 打印該讀數:
2018 Audi A9 This car has 66 miles on it.可對方法 update_odometer() 進行擴展,使其能夠在修改里程表讀數時做一些額外的工作,添加一些邏輯,禁止任何人將里程表讀數往回調:
class Car():def __init__(self,make,model,year):self.make = makeself.model = modelself.year = yearself.odometer_reading = 50def get_descriptive_name(self):long_name = str(self.year) + ' ' + self.make + ' ' +self.modelreturn long_name.title()def read_odomter(self):print("This car has " + str(self.odometer_reading) + " miles on it.")def update_odometer(self,mileage):if mileage >= self.odometer_reading:self.odometer_reading = mileageelse:print("You can't roll back an odometer!")my_new_car = Car('audi','a9','2018') print(my_new_car.get_descriptive_name())my_new_car.update_odometer(33) my_new_car.read_odomter()修改 self.odometer_reading 的默認值為50,當我們再次嘗試修改其值為33時,由于小于原來的里程,因此無法修改:
2018 Audi A9 You can't roll back an odometer! This car has 50 miles on it.● 通過方法對屬性的值進行遞增:
有時候需要將屬性值遞增到特定的量,而不是將其設置為全新的值,假設我們購買了一輛二手車,從購買到登記期間增加了100英里的里程,下面的方法讓我們能夠傳遞這個增量,并相應地增加里程表讀數:
輸出結果如下:
2018 Audi A9 This car has 6600 miles on it. This car has 6700 miles on it.【8.4】繼承
編寫類時,并非總是要從空白開始,如果要編寫的類是另一個現成類的特殊版本,可使用繼承,一個類繼承另一個類時,它自動獲得另一個類的所有屬性和方法;原有的類稱為父類,而新類稱為子類,子類繼承了其父類的所有屬性和方法,同時還可以定義自己的屬性和方法;繼承的通用語法大致如下:
class ClassName1(object):def __init__(self,name1,name2,name3):--snip--class ClassName2(ClassName1):def __init__(self,name1,name2,name3):super().__init__(name1,name2,name3)--snip--【8.4.1】子類的方法__init__()
class Car():def __init__(self,make,model,year):self.make = makeself.model = modelself.year = yearself.odometer_reading = 0def get_descriptive_name(self):long_name = str(self.year) + ' ' + self.make + ' ' +self.modelreturn long_name.title()class ElectricCar(Car):#電動車的獨特之處def __init__(self,make,model,year):#初始化父類的屬性super().__init__(make,model,year)my_new_car = ElectricCar('tesla','model s','2016') print(my_new_car.get_descriptive_name())創建子類時,父類必須包含在當前文件中,且位于子類前面,定義了子類 ElectricCar,定義子類時,必須在括號內指定父類名稱,方法 __init__()接受創建Car實例所需信息,super() 是一個特殊的函數,幫助Python將父類和子類關聯起來,讓Python調用 ElectricCar 的父類的方法 __init__(),讓 ElectricCar 實例包含父類的所有屬性,父類也稱為超類(superclass),程序輸出結果如下:
2016 Tesla Model S【8.4.2】Python 2.7 中的繼承
在Python 2.7中,ElectricCar類的定義類似于下面這樣:
class Car(object):def __init__(self,make,model,year):--snip--class ElectricCar(Car):def __init__(self,make,model,year):super(ElectricCar,self).__init__(make,model,year)--snip--【8.4.3】給子類定義屬性和方法
讓一個類繼承另一個類后,可添加區分子類和父類所需的新屬性和方法,下面添加一個電動車特有的屬性(battery),以及一個描述該屬性的方法:
class Car():def __init__(self,make,model,year):self.make = makeself.model = modelself.year = yearself.odometer_reading = 0def get_descriptive_name(self):long_name = str(self.year) + ' ' + self.make + ' ' +self.modelreturn long_name.title()class ElectricCar(Car):def __init__(self,make,model,year):super().__init__(make,model,year)self.battery_size = 80def describe_battery(self):print("This car has a " + str(self.battery_size) + "-KWh battery.")my_new_car = ElectricCar('tesla','model s','2016') print(my_new_car.get_descriptive_name()) my_new_car.describe_battery()輸出結果如下:
2016 Tesla Model S This car has a 80-KWh battery.【8.4.4】重寫父類的方法
要重寫父類的方法,只需要在子類中定義一個與要重寫的父類方法同名的方法即可,這樣,Python將不會考慮這個父類的方法,而只關心在子類中定義的相應方法,假設Car類有一個名為 fill_gas_tank() 的方法,對于電動車來說毫無意義,因此可以重寫它:
class ElectricCar(Car):--snip--def fill_gas_tank(self):print("This car doesn't need a gas tank!")【8.4.5】將實例用作屬性
class Car():def __init__(self,make,model,year):self.make = makeself.model = modelself.year = yearself.odometer_reading = 0def get_descriptive_name(self):long_name = str(self.year) + ' ' + self.make + ' ' +self.modelreturn long_name.title()class Battery():#一次模擬電動車電瓶的簡單嘗試def __init__(self,battery_size=70):#初始化電瓶的屬性self.battery_size = battery_sizedef describe_battery(self):#打印一條描述電瓶容量的消息print("This car has a " + str(self.battery_size) + "-KWh battery.")class ElectricCar(Car):def __init__(self,make,model,year):super().__init__(make,model,year)self.battery = Battery()my_new_car = ElectricCar('tesla','model s','2016') print(my_new_car.get_descriptive_name()) my_new_car.battery.describe_battery()輸出結果如下:
2016 Tesla Model S This car has a 70-KWh battery.看起來似乎做了多余的工作,但現在我們可以對電瓶添加更多的描述,而且不會導致 ElectricCar 類混亂不堪,下面再給Battery添加一個方法,使其能夠根據電瓶容量報告汽車的續航里程:
class Car():def __init__(self,make,model,year):self.make = makeself.model = modelself.year = yearself.odometer_reading = 0def get_descriptive_name(self):long_name = str(self.year) + ' ' + self.make + ' ' +self.modelreturn long_name.title()class Battery():#一次模擬電動車電瓶的簡單嘗試def __init__(self,battery_size=70):#初始化電瓶的屬性self.battery_size = battery_sizedef describe_battery(self):#打印一條描述電瓶容量的消息print("This car has a " + str(self.battery_size) + "-KWh battery.")def get_range(self):#打印一條消息,指出電瓶的續航里程if self.battery_size == 70:range = 240elif self.battery_size == 90:range = 280message = "This car can go approximately " + str(range)message += " miles on a full charge."print(message)class ElectricCar(Car):def __init__(self,make,model,year):super().__init__(make,model,year)self.battery = Battery()my_new_car = ElectricCar('tesla','model s','2016') print(my_new_car.get_descriptive_name()) my_new_car.battery.describe_battery() my_new_car.battery.get_range()輸出結果如下:
2016 Tesla Model S This car has a 70-KWh battery. This car can go approximately 240 miles on a full charge.【8.5】導入類
Python允許將類儲存在模塊中,然后在主程序中導入所需的模塊
【8.5.1】導入單個類
#car.py #一個用于表示汽車的類class Car():def __init__(self,make,model,year):#初始化描述汽車的屬性self.make = makeself.model = modelself.year = yearself.odometer_reading = 0def get_descriptive_name(self):#返回整潔的描述性名稱long_name = str(self.year) + ' ' + self.make + ' ' +self.modelreturn long_name.title()def read_odomter(self):#打印一條消息,指出汽車的里程print("This car has " + str(self.odometer_reading) + " miles on it.")def update_odometer(self):#將里程表讀數設置為指定的值,拒絕將里程表往回撥if mileage >= self.odometer_reading:self.odometer_reading = mileageelse:print("You can't roll back an odometer!")def increment_odometer(self,miles):#將里程表讀數增加指定的量self.odometer_reading += miles創建另一個文件——my_car.py,在其中導入Car類并創建其實例:
#my_car.pyfrom car import Carmy_new_car = Car('audi','a9','2018') print(my_new_car.get_descriptive_name())my_new_car.odometer_reading = 23 my_new_car.read_odometer()import語句讓Python打開模塊car,并導入其中的Car類,輸出結果如下:
2018 Audi A9 This car has 23 miles on it.【8.5.2】在一個模塊中儲存多個類
將類Battery和ElectricCar都加入到模塊car.py中:
#car.py #一組用于表示燃油汽車和電動汽車的類class Car():def __init__(self,make,model,year):#初始化描述汽車的屬性self.make = makeself.model = modelself.year = yearself.odometer_reading = 0def get_descriptive_name(self):#返回整潔的描述性名稱long_name = str(self.year) + ' ' + self.make + ' ' +self.modelreturn long_name.title()def read_odometer(self):#打印一條消息,指出汽車的里程print("This car has " + str(self.odometer_reading) + " miles on it.")def update_odometer(self):#將里程表讀數設置為指定的值,拒絕將里程表往回撥if mileage >= self.odometer_reading:self.odometer_reading = mileageelse:print("You can't roll back an odometer!")def increment_odometer(self,miles):#將里程表讀數增加指定的量self.odometer_reading += milesclass Battery():#一次模擬電動車電瓶的簡單嘗試def __init__(self,battery_size=70):#初始化電瓶的屬性self.battery_size = battery_sizedef describe_battery(self):#打印一條描述電瓶容量的消息print("This car has a " + str(self.battery_size) + "-KWh battery.")def get_range(self):#打印一條消息,指出電瓶的續航里程if self.battery_size == 70:range = 240elif self.battery_size == 90:range = 280message = "This car can go approximately " + str(range)message += " miles on a full charge."print(message)class ElectricCar(Car):#模擬電動車的獨特之處def __init__(self,make,model,year):#初始化父類的屬性,再初始化電動車特有的屬性super().__init__(make,model,year)self.battery = Battery()新建一個my_electric_car.py的文件,導入ElectricCar類,并創建一輛電動車:
#my_electric_car.pyfrom car import ElectricCarmy_tesla = ElectricCar('tesla','model s','2016')print(my_tesla.get_descriptive_name()) my_tesla.battery.describe_battery() my_tesla.battery.get_range()輸出結果如下:
2016 Tesla Model S This car has a 70-KWh battery. This car can go approximately 240 miles on a full charge.【8.5.3】從一個模塊中導入多個類
可根據需要在程序文件中導入任意數量的類,假如我們要在同一個程序中創建普通汽車和電動汽車,就需要將類Car和ElectricCar類都導入,多個類之間用逗號進行分隔:
#my_car.pyfrom car import Car,ElectricCarmy_audi = Car('audi','a9','2018') print(my_audi.get_descriptive_name())my_tesla = ElectricCar('tesla','model s','2016') print(my_tesla.get_descriptive_name())輸出結果如下:
2018 Audi A9 2016 Tesla Model S【8.5.4】導入整個模塊
導入整個模塊后,需要使用句點表示法訪問需要的類:
#my_car.pyimport carmy_audi = car.Car('audi','a9','2018') print(my_audi.get_descriptive_name())my_tesla = car.ElectricCar('tesla','model s','2016') print(my_tesla.get_descriptive_name())我們導入了整個car模塊,需要使用語法 module_name.class_name 訪問需要的類,程序輸出結果與8.5.3一致:
2018 Audi A9 2016 Tesla Model S【8.5.5】導入模塊中的所有類
要導入模塊中的所有類,可使用以下語法:
from module_name import *這種導入方法是不推薦的,沒有明確指出你使用了模塊中的哪些類,還可能引發名稱方面的困惑,需要從一個模塊中導入很多類時,最好導入整個模塊,并使用 module_name.class_name 語法來訪問類
【8.5.6】在一個模塊中導入另一個模塊
有時候需要將類分散到多個模塊當中,以免模塊太大,或者在同一個模塊中儲存不相關的類,將類儲存在多個模塊中時,一個模塊中的類可能會依賴于另一個模塊中的類,這種情況下,我們可以在前一個模塊中導入必要的類,以下例子中,將Car類儲存在一個模塊當中,并將ElectricCar和Battery類儲存在另一個模塊當中,將第二個模塊命名為electric_car.py,并將ElectricCar和Battery類復制到這個模塊中:
#electric_car.py #一組可用于表示電動汽車的類from car import Carclass Battery():#一次模擬電動車電瓶的簡單嘗試def __init__(self,battery_size=70):#初始化電瓶的屬性self.battery_size = battery_sizedef describe_battery(self):#打印一條描述電瓶容量的消息print("This car has a " + str(self.battery_size) + "-KWh battery.")def get_range(self):#打印一條消息,指出電瓶的續航里程if self.battery_size == 70:range = 240elif self.battery_size == 90:range = 280message = "This car can go approximately " + str(range)message += " miles on a full charge."print(message)class ElectricCar(Car):#模擬電動車的獨特之處def __init__(self,make,model,year):#初始化父類的屬性,再初始化電動車特有的屬性super().__init__(make,model,year)self.battery = Battery() #car.py #一個可用于表示汽車的類class Car():def __init__(self,make,model,year):#初始化描述汽車的屬性self.make = makeself.model = modelself.year = yearself.odometer_reading = 0def get_descriptive_name(self):#返回整潔的描述性名稱long_name = str(self.year) + ' ' + self.make + ' ' +self.modelreturn long_name.title()def read_odometer(self):#打印一條消息,指出汽車的里程print("This car has " + str(self.odometer_reading) + " miles on it.")def update_odometer(self):#將里程表讀數設置為指定的值,拒絕將里程表往回撥if mileage >= self.odometer_reading:self.odometer_reading = mileageelse:print("You can't roll back an odometer!")def increment_odometer(self,miles):#將里程表讀數增加指定的量self.odometer_reading += miles現在可以分別從每個模塊中導入類:
#my_car.pyfrom car import Car from electric_car import ElectricCarmy_audi = Car('audi','a9','2018') print(my_audi.get_descriptive_name())my_tesla = ElectricCar('tesla','model s','2016') print(my_tesla.get_descriptive_name())輸出結果如下:
2018 Audi A9 2016 Tesla Model S【8.6】Python標準庫
Python標準庫是一組模塊,安裝的Python都包含它,我們可以使用標準庫中的任何函數和類,只需要在程序的開頭包含一條簡單的import語句,下面以模塊collections中的一個類——OrderedDict(創建字典并記錄其中的鍵-值對的添加順序)為例:
#favorite_languages.pyfrom collections import OrderedDictfavorite_languages = OrderedDict()favorite_languages ['jen'] = 'python' favorite_languages ['sarah'] = 'c' favorite_languages ['edward'] = 'java' favorite_languages ['anly'] = 'python'for name,language in favorite_languages.items():print(name.title() + "'s favorite languages is " +language.title() + ".")輸出結果如下:
Jen's favorite languages is Python. Sarah's favorite languages is C. Edward's favorite languages is Java. Anly's favorite languages is Python.總結
以上是生活随笔為你收集整理的Python3 基础学习笔记 C08 【类】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 强度6.2级 阿富汗地震已造成940人死
- 下一篇: 8岁女童吃荔枝急性中毒!一次不能超过5颗