1. 程式人生 > >python day15 面向物件程式設計

python day15 面向物件程式設計

目錄:

面向物件程式設計

類 class 和 物件 object

什麼是物件:

物件是指現實中的物體或例項

什麼是面向物件:

把一切看成物件(例項),物件和物件之間用方法(行為)建立關聯關係

什麼是類:

  1. 擁有相同屬性和行為的物件分為一組,即為一個類
  2. 類是用來描述物件的工具

面向物件示意

車(類)  ----->> BYD E6(京A.88888) 物件(例項)
         \
          \--->> BMW X5(京B.00000) 物件(例項)

  狗(類)  ----->> 小京巴(戶籍號:
00001) \ \--->> 導盲犬(戶籍號:00002) int(類) --->> 100(物件) \ \-->> 200(物件,例項)

類的建立語法:

 class 類名(繼承列表):
      """類文件字串"""
      例項方法(類內的函式methd) 的定義
      類變數(class variable) 定義
      類方法(@classmethod)定義
      靜態方法(@staticmethod)定義

類的作用:

  1. 可以用類建立一個或多個此類的物件(例項)
  2. 類內的變數和方法能被此類所建立的所有例項所共同擁有

  3. 說明:
    類名必須是識別符號(與變數名命名規則相同,建議首字母大寫)
    類名實質上就是變數,它繫結一個類例項
    類的定義最後面要加兩個空格以告訴解釋執行器,類的定義已經結束

  4. 示例:
    class Dog:
    pass

術語

物件 例項
class object instance

建構函式:

  1. 建構函式的呼叫表示式 
      類名([建立傳參列表])
    [] 裡的內容代表可省略
  2. 作用:
      建立這個類的例項物件,並返回此例項物件的引用關係
  3. 示例:

      class
    Dog:
    # 定義一個類 pass dog1 = Dog()    # 用類來建立一個物件用dog1繫結 print(id(dog1)) # 列印dog1所在的記憶體地址 dog2 = Dog() # 建立第二個物件 用dog2繫結 print(id(dog2)) print(dog1 is dog2) # 判斷兩隻狗是不是同一條狗

例項說明:

  1. 例項有自己的作用域或名字空間,可以為該例項新增例項變數(也叫屬性)
  2. 例項可以呼叫類的方法
  3. 例項可以訪問類中的類變數

例項變數(屬性 attribute)

  1. 每個例項可以有自己的變數,稱為例項變數(屬性)

  2. 屬性的使用語法:
    例項.屬性名

  3. 屬性的賦值規則:(同變數規則相同)

    1. 首次為屬性賦值則建立此屬性
    2. 再次為屬性賦值則改變屬性的繫結關係
  4. 示例:

      class Dog:
          pass
      dog1 = Dog()
      dog1.kinds = "京巴"  #為dog1繫結的例項新增kinds屬性
      dog1.color = "白色"  # 新增屬性
      print(dog1.kinds, dog1.color)  # 訪問屬性
      dog1.color = '黃色' # 修改dog1.color 的繫結關係
      print(dog1.color)
  5. 練習:

    1. 自己寫一個Student類,此類的物件有屬性name, age, score, 用來儲存學生的姓名,年齡,成績
    2. 寫一個函式 input_student讀入n個學生的資訊,用物件來儲存這些資訊(不用字典), 並返回物件的列表
    3. 寫一個函式output_student 列印這些學生資訊(格式不限)
    4. 示意:
      class Dog:
          pass
      dog1 = Dog()
      dog1.kinds = "京巴"  #為dog1繫結的例項新增kinds屬性
      dog1.color = "白色"  # 新增屬性
      print(dog1.kinds, dog1.color)  # 訪問屬性
      dog1.color = '黃色' # 修改dog1.color 的繫結關係
      print(dog1.color)

刪除屬性

  1. del 語句
  2. 語法:
    del 物件.屬性名
  3. 示例:

      class Student:
          pass
    
      stu = Student()
      stu.name = 'xiaozhang'  # 建立屬性
      print(stu.name)
      del stu.name  # 刪除此屬性
      print(stu.name)  # 屬性錯誤,因為屬性已經不存在了

屬性管理函式

  1. getattr(obj, name[, default]) 從一個物件得到物件的屬性;getattr(x, ‘y’) 等同於x.y; 當屬性不存在時,如果給出default引數,則返回default,如果沒有給出default 則產生一個AttributeError錯誤

  2. hasattr(obj, name) 用給定的name返回物件obj是否有此屬性,此種做法可以避免在getattr(obj, name)時引發錯誤

  3. setattr(obj, name, value) 給物件obj的名為name的屬性設定相應的值value, set(x, ‘y’, v) 等同於 x.y = v

  4. delattr(obj, name) 刪除物件obj中的name屬性, delattr(x, ‘y’) 等同於 del x.y

例項方法 method

1.語法:

class 類名(繼承列表):
        def 例項方法名(self, 引數1, 引數2, ....):
           語句塊 
  1. 作用:
    用於描述一個物件的行為,讓此型別的全部物件都擁有相同的行為
  2. 說明
    例項方法的實質是函式,是定義在類內的函式
    例項方法的第一個引數代表呼叫這個方法的例項,一般命名為’self’
  3. 例項方法的呼叫語法:
    例項.例項方法名(呼叫引數)

    類名.例項方法名(例項, 呼叫引數)

初始化方法

  1. 作用:
    對新建立的物件新增屬性等必須的資源
  2. 語法形式:
 class 類名:
        def __init__(self[,引數列表]):
            語句塊
        [] 代表其中內容可省略
  1. 說明:

    1. 初始化方法名必須為init不可改變
    2. 初始化方法會在建構函式建立例項後自動呼叫,且將例項自身通過第一個引數self傳入init方法
    3. 建構函式的實參將通過init方法的引數列表傳到init方法中
    4. 初始化方法內如果需要return語句返回,則必須返回None
  2. 示例見:

    
    # 此示例示意初始化方法的定義方法和呼叫過程
    
    
    class Car:
        """小汽車類"""
        def __init__(self, c, b, m):
            self.color = c  # 顏色
            self.brand = b  # 品牌
            self.model = m  # 型號
            self.wheel = 4
            print("__init__方法被呼叫")
    
        def run(self, speed):
            print(self.color, '的', self.brand,
                  self.model, '正在以', speed,
                  '公里/小時的速度行駛')
    
        def change_color(self, c):
            self.color = c
    
    a4 = Car('紅色', '奧迪', 'A4')
    a4.run(199)
    a4.change_color("白色")
    a4.run(280)
    
    
    x5 = Car('藍色', '寶馬', 'x5')
    x5.run(188)
    
  3. 練習:
    修改之前練習的Student類,為該類新增初始化方法,實現在建立物件時自動新增name,age,score屬性

析構方法:

  1. 語法形式:

     class 類名:
            def __del__(self):
                語句塊
  2. 作用:
    在物件被銷燬之前被呼叫,主要負責清理物件所佔用的資源

  3. 說明:
    python建議儘可能少的在析構方法內做事情,因為銷燬時間難以確定

  4. 示例見:

    class FileManage:
        """定義一個檔案管理員類"""
        def __init__(self, filename='a.txt'):
            self.file = open(filename, 'w')
    
        def writeline(self, string):
            self.file.write(string)
            self.file.write('\n')
    
        def __del__(self):
            """析構方法會在物件銷燬前自動呼叫"""
            self.file.close()
            print("檔案已關閉")
    
    fm = FileManage()
    fm.writeline("hello world")
    fm.writeline("這是中文寫的第二行")
    
    del fm
    while True:  # 死迴圈永遠不退出
        pass
    
    print("程式結束")