一· 類
-
根據約定,首字母大寫的名稱指的是類。
class Dog(): """一次模擬小狗的簡單嘗試""" #文件字串,對這個類的功能作了描述。 複製程式碼
-
方法 (唯一區別於函式的是呼叫方法)
* __init__() 開頭和末尾各有兩個下劃線,這是一種約定,旨在避免Python預設方法與普通方法發生名稱衝突。 * def _init_(self,name,age) 我們將方法__init__() 定義成了包含三個形參:self 、name 和age 。形參self 必不可少,還必須位於 其他形參的前面。因為Python呼叫這個__init__() 方法來建立Dog 例項時,將自動傳入實參self 。每個與 類相關聯的方法呼叫都自動傳遞實參self ,它是一個指向例項本身的引用,讓例項能夠訪問類中的屬性和方法。 我們將通過實參向Dog() 傳遞名字和年齡;self 會自動傳遞。 複製程式碼
-
屬性(通過例項訪問的變數)
* self.name = name self.age = age 以self為字首的變數都可供類中的所有方法使用,我們還可以通過類的任何例項來 訪問這些變數。self.name = name 獲取儲存在形參name 中的值,並將其儲存到變數name 中,然後該變數被 關聯到當前建立的例項。 複製程式碼
3.例項
* class Dog():
my_dog = Dog('willie', 6)
print( my_dog.name.title() )
使用Dog 類,建立一條名字為'willie' 、年齡為6 的小狗。Python使用實參'willie' 和6 呼叫Dog 類
中的方法__init__() 。方法__init__() 建立一個表示特定小狗的示例,並使用我們提供的值來設定屬性
name 和age 。例項儲存在變數my_dog 中。我們通常可以認為首字母大寫的名稱(如Dog )指的是類,而
小寫的名稱(如my_dog )指的是根據類建立的例項。
* class Dog():
"""一次模擬小狗的簡單嘗試"""
def __init__(self, name, age):
"""初始化屬性name和age"""
self.name = name
self.age = age
def sit(self):
"""模擬小狗被命令時蹲下"""
print(self.name.title() + " is now sitting.")
def roll_over(self):
"""模擬小狗被命令時打滾"""
print(self.name.title() + " rolled over!")
class Dog():
my_dog = Dog('willie', 6)
your_dog = Dog('lucy', 3)
my_dog.sit()
your_dog.sit()
複製程式碼
4.修改屬性的值
*直接修改屬性的值
通過例項直接訪問它
my_new_car.odometer_reading = 23
*通過方法修改屬性的值
def update_odometer(self, mileage):
"""將里程錶讀數設定為指定的值"""
self.odometer_reading = mileage
my_new_car.update_odometer(23)
*通過方法對屬性的值進行遞增
def increment_odometer(self, miles):
"""將里程錶讀數增加指定的量"""
self.odometer_reading += miles
複製程式碼
5.繼承
-
繼承了其父類的所有屬性和方法,同時還可以定義自己的屬性和方法
-
給父類的所有屬性賦值。
-
建立子類時,父類必須包含在當前檔案中,且位於子類前面
-
super() 是一個特殊函式,幫助Python將父類和子類關聯起來。
class Car(): ...... 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()) 複製程式碼
-
重寫父類的方法
假設Car 類有一個名為fill_gas_tank() 的方法,你可能想重寫它。
def ElectricCar(Car): --snip-- def fill_gas_tank(): """電動汽車沒有油箱""" print("This car doesn't need a gas tank!") 複製程式碼
如果有人對電動汽車呼叫方法fill_gas_tank() ,Python將忽略Car 類中的方法fill_gas_tank() ,轉而執行上述程式碼
-
將例項用作屬性
當子類中需要新增的細節太多,可將這些屬性和方法提取出來,放到另一個名 為Battery 的類中,並將一個Battery 例項用作ElectricCar 類的一個屬性:
class Car(): --snip-- 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.") 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() #在例項my_tesla中查詢屬性battery,並從屬性中呼叫方法describe_battery() 複製程式碼
-
匯入類(簡化此檔案程式碼)
from car import Car #一個類 開啟模組car,並匯入其中的Car類 from car import Car, ElectricCar #多個類 複製程式碼
-
類名應採用駝峰命名法,即將類名中的每個單詞的首字母都大寫,而不使用下劃線。例項名和模組名都採用小寫格式,並在單詞之間加上下劃線
二·檔案
1.讀取檔案
with open('pi_digits.txt') as file_object:
contents = file_object.read()
print(contents)
#關鍵字with 在不再需要訪問檔案後將其關閉
#函式open()接受一個引數:要開啟的檔案的名稱。
#使用方法read()讀取這個檔案的全部內容儲存在變數contents 中
方法readlines() 從檔案中讀取每一行作為一個元素,並將其儲存在一個列表中
#區別於原檔案,read()到達檔案末尾會返回一個空字串,
輸出末尾多了一個空行,l可用rstrip()刪除
複製程式碼
2.檔案路徑
-
相對檔案路徑(同在python_work資料夾,處於平行關係的情況)
with open('text_files\filename.txt') as file_object Python到資料夾python_work下的資料夾text_files中去查詢指定的.txt檔案 複製程式碼
-
絕對檔案路徑(檔案在計算機中的準確位置)
file_path = 'C:\Users\ehmatthes\other_files\text_files\filename.txt' with open(file_path) as file_object: #因為路徑很長,將其儲存在一個變數 複製程式碼
tips:print 語句自動會加上空行符
可使用方法replace() 將字串中的特定單詞都替換為另一個單詞
>>> message = "I really like dogs."
>>> message.replace('dog', 'cat')
'I really like cats.'
複製程式碼
3.寫入檔案
-
讀取模式 ('r' )、寫入模式 ('w' )、附加模式 ('a' )、能夠讀取和寫入檔案的模式('r+' )
-
要寫入的檔案不存在,函式open() 將自動建立它。 然而,以寫入('w' )模式開啟檔案時千萬要小心,因為如果指定的檔案已經存在,Python將在返回檔案物件前清空 該檔案
filename = 'programming.txt' with open(filename, 'w') as file_object: file_object.write("I love programming.") #方法write() 將一個字串寫入檔案,注意換行符 複製程式碼
-
Python只能將字串寫入文字檔案。要將數值資料儲存到文字檔案中,必須先使用函式str() 將其轉換為字串格式。
4.處理異常
處理ZeroDivisionError 異常(無法按照你的程式碼要求執行時)
處理FileNotFoundError 異常(找不到檔案)
-
try-except 程式碼塊(若讓程式異常時不告訴使用者,則在except中引用pass語句什麼都不做)
try: print(5/0) except ZeroDivisionError: print("You can't divide by zero!") 複製程式碼
-
else 程式碼塊
try: answer = int(first_number) / int(second_number) except ZeroDivisionError: print("You can't divide by 0!") else: print(answer) 複製程式碼
5.分析文字
-
計算一個文字包含多少個單詞
方法split()以空格為分隔符將字串分拆成多個部分,根據一個字串建立一個單詞列表 len()得到單詞個數
-
使用多個檔案(利用for)
將程式碼移到函式count_words()中 def count_words(filename): --snip-- filenames = ['alice.txt', 'siddhartha.txt', 'moby_dick.txt', 'little_women.txt'] for filename in filenames: count_words(filename) 複製程式碼
-
儲存資料
json.dump()#寫入 和json.load()#讀取載入
6.重構將程式碼劃分為一系列完成具體工作的函式, 讓程式碼更清晰、更易於理 解、更容易擴充套件。
三、測試
單元測試 用於核實函式的某個方面沒有問題;
測試用例 是一組單元測試,這些單元測試一起核實函式在各種情形下的
行為都符合要求。
複製程式碼
-
編寫測試用例
要為函式編寫測試用例,可先匯入模組unittest 以及要測試的函 數,再建立一個繼承unittest.TestCase 的類,並編寫一系列方法對函式行為的不同方面進行測試 import unittest from name_function import get_formatted_name class NamesTestCase(unittest.TestCase): """測試name_function.py""" def test_first_last_name(self): """能夠正確地處理像Janis Joplin這樣的姓名嗎?""" formatted_name = get_formatted_name('janis', 'joplin') self.assertEqual(formatted_name, 'Janis Joplin') #斷言(判斷q變數與預期字串結果是否相同) unittest.main() #執行測試 複製程式碼
方法名必須以test_打頭,這樣它才會在我們執行test_name_function.py時自動執行
四、斷言方法
unittest Module中的斷言方法
* assertEqual(a, b) 核實a == b * assertNotEqual(a, b) 核實a != b * assertTrue(x) 核實x 為True * assertFalse(x) 核實x 為False * assertIn(item , list ) 核實 item 在 list 中 * assertNotIn(item , list ) 核實 item 不在 list 中 複製程式碼
-
方法assertIn(x,list) 來核實它包含在答案列表中
-
方法setUp() 來建立一個調查物件和一組答案
你在TestCase 類中包含了方法setUp(),Python將先執行它,再執行各個以test_打頭的方法 def setUp(self): """ 建立一個調查物件和一組答案,供使用的測試方法使用 """ question = "What language did you first learn to speak?" self.my_survey = AnonymousSurvey(question) self.responses = ['English', 'Spanish', 'Mandarin'] 複製程式碼