Day 3 筆記

poluoo發表於2019-03-24

一· 類

  • 根據約定,首字母大寫的名稱指的是類。

    class Dog(): 
    """一次模擬小狗的簡單嘗試""" #文件字串,對這個類的功能作了描述。
    複製程式碼
  1. 方法 (唯一區別於函式的是呼叫方法)

     *  __init__()
     開頭和末尾各有兩個下劃線,這是一種約定,旨在避免Python預設方法與普通方法發生名稱衝突。
    
     *  def _init_(self,name,age)
    我們將方法__init__() 定義成了包含三個形參:self 、name 和age 。形參self 必不可少,還必須位於
    其他形參的前面。因為Python呼叫這個__init__() 方法來建立Dog 例項時,將自動傳入實參self 。每個與
    類相關聯的方法呼叫都自動傳遞實參self ,它是一個指向例項本身的引用,讓例項能夠訪問類中的屬性和方法。
    我們將通過實參向Dog() 傳遞名字和年齡;self 會自動傳遞。
    複製程式碼
  2. 屬性(通過例項訪問的變數)

    *  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']
    複製程式碼

相關文章