日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

《Python编程从入门到实践》学习笔记8(第9章:类)

發布時間:2024/4/15 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《Python编程从入门到实践》学习笔记8(第9章:类) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

筆者從昨天開始感覺到了課程的難度,接下來不能簡單的概括知識點。筆者將會按照書上的標題章節來整理知識點。這樣看起來會更加直觀。

9.1 創建類和使用類

9.1.1 創建Dog類

1 class Dog(): 2 """一次模擬小狗的簡單嘗試""" 3 4 def __init__(self,name,age): 5 """初始化屬性name和age""" 6 self.name = name 7 self.age = age 8 9 def sit(self): 10 """模擬小狗被命令時蹲下""" 11 print(self.name.title() + " is now sitting.") 12 13 def roll_over(self): 14 """模擬小狗被命令時打滾""" 15 print(self.name.title() + " rolled over!")

根據約定,在Python中,首字母大寫的名稱指的是類。這個類定義中的括號是空的,因為我們要從空白創建這個類。

第2行是之前提到過的文檔字符串,對這個類的功能做了描述。

1.方法_init_()

類中的函數稱為方法;_init_()方法時候一個特殊的方法,每當你根據Dog類創建新實例時,Python都會自動運行它。開頭和末尾的下劃線,這是一種約定,旨在避免Python默認方法與普通方法發生名稱沖突。

在這個方法的定義中,形參self必不可少,必須位于其他形參前面。原因:Python調用這個方法來創建Dog實例時,將自動傳入實參self。每個與類相關聯的方法調用都自動傳遞實參self,它是一個指向實例本身的引用,讓實例能夠訪問類的屬性和方法。

self會自動傳遞,因此我們不需要傳遞它。每當我們創建實例時,只需要給最后兩個形參提供值。

第6行和第7行定義了兩個以self為前綴的變量,可供類中的所有方法使用,還可以通過類的任何實例來訪問這些變量。self.name = name獲取存儲在形參name中的值,并將它存儲到變量name中,然后該變量被關聯到當前創建的實例。像這樣可通過實例訪問的變量稱為屬性。

2.在Python2.7中創建類

class ClassName(object):--ship--

9.1.2 根據類創建實例

可將類視為有關如何創建實例的說明。

下面來創建一個表示特定小狗的實例:

class Dog():--ship--my_dog = Dog('while', 6)print("My dog's name is " + my_dog.name.title() + ".") print("My dog is "+str(my_dog.age) + " years old")

方法_init_()并未顯式地包含return語句,但Python自動返回一個表示這條小狗的實例。我們將這個實例存儲在變量my_dog中。

1.訪問屬性

要訪問實例的屬性,可以使用句點表示方法。

2.調用方法

創建實例后,可以使用句點表示法來調用Dog類中定義的任何方法。

class Dog():--ship--my_dog = Dog('while', 6) my_dog.sit() my_dog.roll_over()

3.創建多個實例

my_dog = Dog('while', 6) your_dog = Dog('lucy',3)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()

可以按需求根據一個類創建任意數量的實例,條件是將每個實例都存儲在不同的變量中,或占用列表或字典的不同位置。

9.2 使用類和實例

9.2.1 Car 類,給屬性指定默認值

類中的每個屬性都必須有初始值。在有些情況下,如設置默認值時,在方法方法_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()def read_odometer(self):"""打印一條指出汽車里程的消息"""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.2修改屬性的值

可以以三種不同的方式修改屬性的值:直接通過實例進行修改;通過方法進行設置;通過方法進行遞增(增加特定的值)。

1.直接修改屬性的值

my_new_car.odometer_reading = 23 my_new_car.read_odometer()

使用句點表示法來直接訪問并設置汽車的屬性odometer_reading。

2.通過方法修改屬性的值

class Car():--ship-- def update_odometer(self,mileage):"""將里程表讀數設置為指定的值"""self.odometer_reading = mileagemy_new_car = Car('audi','a4',2016) print(my_new_car.get_descriptive_name())my_new_car.update_odometer(23) my_new_car.read_odometer()

3.通過方法對屬性的值進行遞增

class Car():--ship--def update_odometer(self,mileage):--ship-- def increament_odometer(self,miles):"""將里程表讀數增加指定的量"""self.odometer_reading += milesmy_new_car = Car('audi','a4',2016) print(my_new_car.get_descriptive_name())my_new_car.update_odometer(23) my_new_car.read_odometer()my_new_car.increament_odometer(100) my_new_car.read_odometer()

輸出結果:

2016 Audi A4 This car has 23 miles on it This car has 123 miles on it

9.3繼承

編寫類時,并非總要從空白開始。如果你要編寫的類是另一個現成類的特殊版本,可使用繼承。一個類繼承另一個類時,它將自動獲得另一個類的所有屬性和方法;原有的類稱為父類,而新的類稱為子類。子類繼承了其父類的所有屬性和方法,同時還可以定義自己的屬性和方法。

9.3.1 子類的方法_init_()

創建子類的實例時,Python首先需要完成的任務是給父類所有的屬性賦值。為此子類的方法_init_()需要父類施以援手。

下面創建一個簡單的ElectriCar類版本,它具備Car類的所有功能:

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,mileage):"""將里程表讀數設置為指定的值"""self.odometer_reading = mileagedef increament_odometer(self,miles):"""將里程表讀數增加指定的量"""self.odometer_reading += miles class ElectricCar(Car):"""電動車的獨特之處"""def __init__(self,make,model,year):"""初始化父類的屬性"""super().__init__(make,model,year)my_tesla = ElectricCar('tesla','model s',2016) print(my_tesla.get_descriptive_name())

用粉紅色標出的括號不能丟,否則會報錯。出現:descriptor '__init__' requires a 'super' object but received a 'str' 的錯誤。

9.3.2 Python2.7中的繼承

在Python2.7中,繼承的語法稍有不同,ElectricCar類的定義類似于下面這樣:

class Car(object):def_init_(self,make,model,year):--ship--class ElectricCar(Car):def_init_(self,make,model,year):super(ElectricCar,self)._init_(make,model,year)--ship--

函數super()需要兩個實參:子類名和對象self。另外,在Python2.7中使用繼承時,務必在定義父類時在括號內指定object。

9.3.3 給子類定義屬性和方法

class Car():--ship--class ElectricCar(Car):"""電動車的獨特之處"""def __init__(self,make,model,year):"""電動汽車的獨特之處初始化父類的屬性,再初始化電動汽車特有的屬性"""super().__init__(make,model,year)self.battery_size = 70def describe_battery(self):"""打印一條描述電瓶容量的消息"""print("This car has a " + str(self.battery_size) + "-kwh battery.")my_tesla = ElectricCar('tesla','model s',2016) print(my_tesla.get_descriptive_name()) my_tesla.describe_battery()

輸出結果:

2016 Tesla Model S This car has a 70-kwh battery.

9.3.4 重寫父類的方法

可以在子類中定義一個這樣的方法,即它與要重寫的父類方法同名。

假設Car類有一個名為fill_gas_tank()的方法,它對電動汽車毫無意義,因此可以重寫它,下面演示了一種重寫方式:

class ElectricCar():--ship--def fill_gas_tank(self):"""電動汽車沒有郵箱"""print("This car doesn't need a gas tank!")

9.3.5 將實例用作屬性

使用代碼模擬實物時,屬性和方法清單以及文件都越來越長。在這種情況下,可能需要將類的一部分作為一個獨立的類提取出來。可以將大型類拆分成多個協同工作的小類。

例如,不斷給ElectricCar添加細節時,可能會包含很多專門針對汽車電瓶的屬性和方法。在這種情況下,我們可將這些屬性和方法提取出來,放到另一個名為Battery的類中,并將一個Battery的實例用作ElectricCar()類的一個屬性:

class Car():--ship--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_tesla = ElectricCar('tesla','model s',2016) print(my_tesla.get_descriptive_name()) my_tesla.battery.describe_battery()

先是定了一個新類Battery,在方法_init_()處除self外,還有另一個形參battery_size。這個形參是可選的:如果沒有給它提供任何值,電瓶容量將被設置為70。

在ElectricCar類中添加了一個名為self.battery的屬性。讓Python創建一個新的Battery實例(由于沒有指定尺寸,因此為默認值70),并將該實例存儲在屬性self.battery中。每當方法_init_()被調用時,都執行該操作;因此現在每個ElectricCar實例都包含一個自動創建的Battery實例。

輸出與我們前面看到的相同:

2016 Tesla Model S This car has a 70-kwh battery.

下面再給Battery類添加一個方法,它根據電瓶容量報告汽車的續航里程:

class Car():--ship--class Battery():--ship--def get_range(self):"""打印一條消息,指出電瓶的續航里程"""if self.battery_size == 70:range = 240elif self.battery_size == 85:range = 270message = "This car can go approximately " +str(range)message += " miles on a full charge."print(message)class ElectricCar(Car):--ship--my_tesla = ElectricCar('tesla','model s',2016) print(my_tesla.get_descriptive_name()) my_tesla.battery.describe_battery() my_tesla.battery.get_range()

這個方法,也通過汽車的屬性battery來調用它。輸出指出了汽車的續航里程(這取決于電瓶的容量):

2016 Tesla Model S This car has a 70-kwh battery. This car can go approximately 240 miles on a full charge.

?9.4 導入類

?9.4.1 導入單個類

首先,創建一個只包含Car類的模塊。由于在本章中,已經有一個名為car.py的文件,但這個模塊也命名為car.py,因為它包含表示汽車的代碼。我們將這樣解決問題:將Car類存儲在一個名為car.py的模塊中,該模塊將覆蓋前面使用的文件car.py。從現在開始,使用該模塊的程序都必須使用更加具體的文件名,如my_car.py。下面是模塊car.py,其中只包含Car類的代碼:

接著,創建另一個文件——my_car.py,在其中導入Car類并創建實例。

from car import Car

9.4.2 在一個模塊中存儲多個類

雖然同一個模塊中的類之間應存在某種相關性,但可根據需要在一個模塊中存儲任意數量的類。

9.4.3 從一個模塊中導入多個類

from car import Car,ElectricCar

9.4.4 導入整個模塊

可以導入整個模塊,再使用句點表示法訪問需要的類

imprt car

my_beetle = car.Car('volkswagen','beetle,2016)

9.4.5 導入模塊中的所有類

from module_name import*

不推薦使用這種導入方式,原因有二。首先,如果只要看一下文件開頭的import語句,就能清楚地知道程序使用了哪些類。但是這種導入方式沒有明確地指出你使用了模塊中的哪些類。這種方式還可能引發名稱方面的困惑。如果一不小心導入了一個與程序文件中其他同名的類,將引發難以診斷的錯誤。

9.4.6 在一個模塊中導入另一個模塊

如果一個模塊中的類依賴于另一個模塊中的類,可在前一個模塊中導入必要的類。

例如,將Car類存儲在一個模塊中,并將ElectricCar和Battery類存儲在另一個模塊中。我們將第二個模塊命名為electric_car.py。

electric_car.py

“““一組可用于表示電動汽車的類”””from car import Carclass Battery():--ship--class ElectricCar(car):--ship--

?

這一章的知識似乎很多,動手試一試,筆者沒有每個都做,下面舉個栗子吧。

p160 9-14 骰子

from random import randintclass Die():def __init__(self,sides = 6):self.sides = sidesdef roll_die(self):result=randint(1,self.sides)return resulttouzi = Die() results = [] print("6面的骰子,擲10次:") for time in range(10):results.append(touzi.roll_die()) print(results)results = [] middle_touzi =Die(10) print("\n10面的骰子,擲10次:") for time in range(10):results.append(middle_touzi.roll_die()) print(results)results = [] big_touzi = Die(20) print("\n20面的骰子,擲10次:") for time in range(10):results.append(big_touzi.roll_die()) print(results)

輸出的結果:

6面的骰子,擲10次: [2, 5, 1, 3, 4, 2, 6, 5, 6, 1]10面的骰子,擲10次: [9, 1, 8, 4, 3, 7, 1, 6, 9, 5]20面的骰子,擲10次: [4, 13, 9, 17, 13, 3, 13, 8, 1, 11]

?用了列表的形式進行展示,是為了輸出結果的美觀。

9.6 類編碼風格

類名采用駝峰命名法,即將類名中的每個單詞的首字母都大寫,而不使用下劃線。實例名和模塊名都采用小寫格式,并在單詞之間加上下劃線。

對于每個類,都應該緊跟類定義后面包含一個文檔字符串。

可用空行來組織代碼,但不能濫用。在類中,可使用一個空行來分隔方法;而在模塊中,可使用兩個空行來分隔類。

需要同時導入標準庫中的模塊和你編寫的模塊時,先編寫導入標準模塊的import語句,再添加一個空行,然后編寫導入你自己編寫的模塊的import語句。

轉載于:https://www.cnblogs.com/cathycheng/p/11202991.html

總結

以上是生活随笔為你收集整理的《Python编程从入门到实践》学习笔记8(第9章:类)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。