python day15 面向物件程式設計
目錄:
面向物件程式設計
類 class 和 物件 object
什麼是物件:
物件是指現實中的物體或例項
什麼是面向物件:
把一切看成物件(例項),物件和物件之間用方法(行為)建立關聯關係
什麼是類:
- 擁有相同屬性和行為的物件分為一組,即為一個類
- 類是用來描述物件的工具
面向物件示意
車(類) ----->> BYD E6(京A.88888) 物件(例項)
\
\--->> BMW X5(京B.00000) 物件(例項)
狗(類) ----->> 小京巴(戶籍號: 00001)
\
\--->> 導盲犬(戶籍號:00002)
int(類) --->> 100(物件)
\
\-->> 200(物件,例項)
類的建立語法:
class 類名(繼承列表):
"""類文件字串"""
例項方法(類內的函式methd) 的定義
類變數(class variable) 定義
類方法(@classmethod)定義
靜態方法(@staticmethod)定義
類的作用:
- 可以用類建立一個或多個此類的物件(例項)
類內的變數和方法能被此類所建立的所有例項所共同擁有
說明:
類名必須是識別符號(與變數名命名規則相同,建議首字母大寫)
類名實質上就是變數,它繫結一個類例項
類的定義最後面要加兩個空格以告訴解釋執行器,類的定義已經結束示例:
class Dog:
pass
術語
類 | 物件 | 例項 |
---|---|---|
class | object | instance |
建構函式:
- 建構函式的呼叫表示式
類名([建立傳參列表])
[] 裡的內容代表可省略 - 作用:
建立這個類的例項物件,並返回此例項物件的引用關係 示例:
class
例項說明:
- 例項有自己的作用域或名字空間,可以為該例項新增例項變數(也叫屬性)
- 例項可以呼叫類的方法
- 例項可以訪問類中的類變數
例項變數(屬性 attribute)
每個例項可以有自己的變數,稱為例項變數(屬性)
屬性的使用語法:
例項.屬性名屬性的賦值規則:(同變數規則相同)
- 首次為屬性賦值則建立此屬性
- 再次為屬性賦值則改變屬性的繫結關係
示例:
class Dog: pass dog1 = Dog() dog1.kinds = "京巴" #為dog1繫結的例項新增kinds屬性 dog1.color = "白色" # 新增屬性 print(dog1.kinds, dog1.color) # 訪問屬性 dog1.color = '黃色' # 修改dog1.color 的繫結關係 print(dog1.color)
練習:
- 自己寫一個Student類,此類的物件有屬性name, age, score, 用來儲存學生的姓名,年齡,成績
- 寫一個函式 input_student讀入n個學生的資訊,用物件來儲存這些資訊(不用字典), 並返回物件的列表
- 寫一個函式output_student 列印這些學生資訊(格式不限)
- 示意:
class Dog: pass dog1 = Dog() dog1.kinds = "京巴" #為dog1繫結的例項新增kinds屬性 dog1.color = "白色" # 新增屬性 print(dog1.kinds, dog1.color) # 訪問屬性 dog1.color = '黃色' # 修改dog1.color 的繫結關係 print(dog1.color)
刪除屬性
- del 語句
- 語法:
del 物件.屬性名 示例:
class Student: pass stu = Student() stu.name = 'xiaozhang' # 建立屬性 print(stu.name) del stu.name # 刪除此屬性 print(stu.name) # 屬性錯誤,因為屬性已經不存在了
屬性管理函式
getattr(obj, name[, default]) 從一個物件得到物件的屬性;getattr(x, ‘y’) 等同於x.y; 當屬性不存在時,如果給出default引數,則返回default,如果沒有給出default 則產生一個AttributeError錯誤
hasattr(obj, name) 用給定的name返回物件obj是否有此屬性,此種做法可以避免在getattr(obj, name)時引發錯誤
setattr(obj, name, value) 給物件obj的名為name的屬性設定相應的值value, set(x, ‘y’, v) 等同於 x.y = v
delattr(obj, name) 刪除物件obj中的name屬性, delattr(x, ‘y’) 等同於 del x.y
例項方法 method
1.語法:
class 類名(繼承列表):
def 例項方法名(self, 引數1, 引數2, ....):
語句塊
- 作用:
用於描述一個物件的行為,讓此型別的全部物件都擁有相同的行為 - 說明
例項方法的實質是函式,是定義在類內的函式
例項方法的第一個引數代表呼叫這個方法的例項,一般命名為’self’ - 例項方法的呼叫語法:
例項.例項方法名(呼叫引數)
或
類名.例項方法名(例項, 呼叫引數)
初始化方法
- 作用:
對新建立的物件新增屬性等必須的資源 - 語法形式:
class 類名:
def __init__(self[,引數列表]):
語句塊
[] 代表其中內容可省略
說明:
- 初始化方法名必須為init不可改變
- 初始化方法會在建構函式建立例項後自動呼叫,且將例項自身通過第一個引數self傳入init方法
- 建構函式的實參將通過init方法的引數列表傳到init方法中
- 初始化方法內如果需要return語句返回,則必須返回None
示例見:
# 此示例示意初始化方法的定義方法和呼叫過程 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)
練習:
修改之前練習的Student類,為該類新增初始化方法,實現在建立物件時自動新增name,age,score屬性
析構方法:
語法形式:
class 類名: def __del__(self): 語句塊
作用:
在物件被銷燬之前被呼叫,主要負責清理物件所佔用的資源說明:
python建議儘可能少的在析構方法內做事情,因為銷燬時間難以確定示例見:
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("程式結束")