一、昨日內容回顧 成員 1、變數 1、成員變數--最常見 1、寫法: 變數前面加了self就是成員變數 這裡的self表示當前對象 一般是在構造方法中定義 2、調用: 對象.成員變數 3、作用: 可以在類中的不同方法間使用 有點局部的意思(每個對象的成員變數可以不同) 2、類變數(靜態變數) 1、寫... ...
一、昨日內容回顧 成員 1、變數 1、成員變數--最常見 1、寫法: 變數前面加了self就是成員變數 這裡的self表示當前對象 一般是在構造方法中定義 2、調用: 對象.成員變數 3、作用: 可以在類中的不同方法間使用 有點局部的意思(每個對象的成員變數可以不同) 2、類變數(靜態變數) 1、寫法 寫在類中,方法外的變數 2、調用 類名.類變數 3、作用 全局的意思 註意點: 1、如果用對象.類變數,就相當於給對象新增了一個和類變數同名的成員變數 原來的類變數不會有任何變化 2、方法 1、成員方法--最常見 1、範圍: 構造方法: 創建對象的時候,自動調用構造方法 普通方法 2、寫法: 1、第一個參數是self,表示當前對象本身 3、調用 對象.成員方法 內部原理:類名.成員方法(對象名) 2、靜態方法 1、寫法 1、方法上面加上@staticmethod 2、參數沒有self 2、調用 類名.靜態方法 3、作用 把靜態方法理解成類中的函數就可以 3、類方法 1、寫法 1、類方法名字上面加上@classmethod 2、第一個參數是cls 2、調用 類名.類方法 3、作用 用於在類中創建對象,設計模式 3、屬性 1、概念 通過方法的形式來表示一個屬性信息(變數-名稱) 2、引入原因-由來 1、成員變數或者資料庫欄位一般不保存人的年齡,而是保存人的生日 2、因為年齡的話,每年都會變化,生日是不會變化的,易於維護 3、根據出生日期計算年齡,做成一個成員方法的,但是年齡是一個名詞屬性 用方法-動作來計算,稍有點不妥 4、於是,就引入了屬性 3、寫法 1、成員方法的定義上面加上一行@property 4、調用 對象名.屬性名--調屬性 對象名.方法名()--調成員方法 4、私有 1、私有變數 1、寫法 類中,變數名字前面加上雙下劃線__ 2、調用 1、不能用對象進行調用 2、可以在類中的成員方法中使用 3、對象如何間接調用私有變數 1、把私有變數寫在類中的成員方法中 2、對象通過調成員方法,從而間接調用私有變數 2、私有方法 1、寫法 類中,成員方法名字前面加上雙下劃線__ 2、調用 1、不能用對象進行調用 2、可以在類中的成員方法中使用 3、對象如何間接調私有方法 1、把私有方法的調用,寫在類中的成員方法中 2、對象通過調成員方法,從而間接調用私有方法 3、註意點: 1、子類繼承父類的時候,無法繼承父類的私有變數和私有方法 二、今日主要內容 1、依賴關係 1、比較輕的關係 2、例子: 大象裝冰箱 大象裝高壓鍋--多態 你打車 3、寫法 1、類2的對象作為參數傳入到類1的成員方法中 2、在類1的成員方法中,通過類2的對象調類2的成員方法 2、關聯關係(組合、聚合) 1、一對一 1、例子:男女朋友 2、寫法 1、類2的對象作為參數傳入到類1的成員方法中 2、在類1的成員方法體中,把類2的對象賦值給類1的成員變數 3、類1的成員變數就可以指代類2的對象了 4、可以通過類1的成員變數調類2的成員變數,或者類2的成員方法 2、一對多 1、例子:學校和老師 2、寫法 類1-學校類的定義 1、類1-學校類中定義一個成員變數,賦值空列表 2、把類2的對象作為參數傳入到類1的成員方法1中 3、在類1的成員方法體中,把類2的對象添加到空列表 4、在類1的成員方法2中,迴圈遍歷這個列表,列表的每個元素就是類2的對象 通過類2的對象調類2的成員變數 類1的成員方法調用 1、類1的對象每調用一次成員方法1,就新增加一個老師對象到列表中 3、繼承關係,實現關係 1、self:當前執行這個方法的對象 2、子類繼承父類 1、新建的是子類對象,那麼self就是子類對象 2、新建的是父類對象,那麼self就是父類對象 4、特殊成員 1、重點是: __str__() #列印對象,預設是列印對象的記憶體地址; 重寫__str__()後,列印對象的時候,可以列印對象的成員變數 例子: def __str__(self): # return self.name,self.age,self.hobby #報錯 # TypeError: __str__ returned non-string (type tuple) # 返回值必須是字元串,而不能是元組 return '%s %s %s' % (self.name,self.age,self.hobby) __new__() #創建對象的過程 1、載入類 calss 類名 定義類 2、開闢記憶體空間 __new__(cls)方法,此時記憶體空間沒有對象,需要下一步創建 3、創建對象 通過__new__(cls)的返回值 return object.__new__(cls) 來創建對象 註意點:這裡參數是cls類,而不是self對象,因為此時只有類,對象還沒有被創建出來 4、初始化對象 構造方法 __init__() 5、使用對象 對象調成員變數,或者對象調成員方法 2、常見特殊成員 1、__init__() 構造方法 2、__hash__() 類和對象預設是可哈希的,不可變,可以作為字典的key __hash__ = None #就變成不可哈希,可變的,不能作為字典的key 3、__getitem__(value) 對象[key]就是調用__getitem__(value)方法,參數是value 通過key獲取value,類似字典 4、__setitem__() 對象[key] = value 就是調用__setitem__(key,value)方法,參數是key,value 添加鍵值對,類似字典 5、__delitem__(key) del 對象[key]就是調用__delitem__(key)方法,參數是key 通過key刪除鍵值對,類似字典 6、__enter__() return 字元串 7、__exit__() with 對象 as 變數: pass print(變數) 過程如下: 1、先調__enter__()方法進入 2、其返回值,被with後面的變數接收 3、再調__exit__()方法退出 例子:打開文件
一、依賴關係 需求:要把大象裝冰箱 偽代碼思路: 1、新建2個類,大象類和冰箱類 2、關係:大象類要依賴冰箱類 3、大象類--成員方法: 1、開冰箱門--依賴冰箱類--傳入冰箱對象 2、裝自己 3、關冰箱門--依賴冰箱類 4、冰箱類--成員方法: 1、開門 2、關門 需求2:要把大象裝高壓鍋 -這裡的冰箱和高壓鍋 多態 偽代碼思路: 1、新建2個類,大象類和高壓鍋類 2、關係:大象類要依賴高壓鍋類 3、大象類--成員方法: 1、開高壓鍋門--依賴高壓鍋類--傳入高壓鍋對象 2、裝自己 3、關高壓鍋門--依賴高壓鍋類 4、高壓鍋類--成員方法: 1、開門 2、關門 小結: 1、依賴是一種松耦合的關係 大象開冰箱門,冰箱壞了,大象還可以開高壓鍋門 2、多態思想 大象開冰箱門,開高壓鍋門 冰箱和高壓鍋對象就是多態 3、依賴的寫法 1、類a依賴類b 大象類依賴冰箱類 2、類a的成員方法,形參是類b的對象 類a的成員方法的內容: 類b的對象.類b的成員方法() 4、依賴的概念 在方法中引入另一個類的對象 5、沒有特指 大象開冰箱門,想要的對象是一個冰箱-泛指, 具體是哪個冰箱(是那台haier冰箱,還是這台美的冰箱)沒有指定--沒有特指(這台還是那台)
關聯關係:一對一 1、在類1的成員方法中,把類2的對象作為形式參數,傳遞給類1的成員變數 self.類1的成員變數 = 類2的對象 左邊就可以等價於右邊(即類2的對象的地方,可以用類1的對象.成員變數表示 依賴關係和關係關係的區別 一、寫法不同: 1、前者 在類1的成員方法中,把類2的對象作為形式參數 寫法: 類1的成員方法(類2的對象): #這裡類2的對象可以是冰箱,也可以是高壓鍋,多態 類2的對象.類2的成員方法() 2、後者 在類1的成員方法中,把類2的對象作為形式參數,傳遞給類1的成員變數 寫法: 類1的成員方法(類2的對象): self.成員變數=類2的對象 說明:後面凡是用到類2對象的地方,可以用類1對象.成員變數代替 二、例子 1、前者的例子是大象裝冰箱,打車(今天打這個車,明天打那個車) --(類比:關係比較輕,大象可以裝不同的冰箱,你可以打不同的車) 後者的例子是男女朋友--(類比:關係更緊密)
關聯關係中一對一和一對多的區別 一、寫法不同 1、前者 男孩類的成員方法 def meet(self,girl): #參數是女孩對象 女孩對象傳遞給男孩的女朋友這個成員變數 self.girl_friend = girl #關鍵點 #男孩對象的成員變數-girl_friend就是女孩對象 2、後者 學校類的構造方法 self.__techer_list = [] 學校類的成員方法 def recruit(self,t): #招聘-成員方法 參數t是老師對象 self.__techer_list.append(t) 二、例子不同 1、前者的例子是男女朋友 2、後者的例子是學校和老師 擴展: 組合關係、聚合關係和關聯關係的寫法是類似的
四、特殊成員 特殊成員 1、寫法 雙下劃線開頭,雙下劃線結尾的方法 2、作用 特殊場景下,會自動執行 3、例子 __init__() 一、構造方法 1、創建對象的時候,會自動執行構造方法 __init__() 二、__call__()方法 1、用法 新建對象(),就會自動調用__call__()方法 2、對象後面加小括弧 對象()是python特有的 三、__getitem__()方法 1、用法 對象名[key],就會自動調用__getitem__(key)方法 參數就是key 2、類似字典,可以從對象中獲取key 四、__setitem__()方法 1、用法 對象名[key]=value,就會自動調用__setitem__(key,value)方法 參數是key,value 2、類似字典,相當於給對象添加一個鍵值對 五、__delitem__()方法 1、用法 del 對象名[key],就會自動調用__delitem__(key)方法 參數是key 2、類似字典,相當於給對象刪除一個鍵值對 六、__enter__()方法 return var1 __exit__()方法 with 對象 as 變數: print var1 #這裡的var1是__enter__方法的返回值 1、說明: with的執行過程 1、先執行__enter__方法 2、再執行with中的代碼塊 3、最後執行__exit__方法 七、__hash__()方法 1、類名和對象名預設都是可哈希的,不可變的,可以作為字典的key 原因是:萬事萬物都是對象,類名是object的子類 object這個類中有__hash__()方法 這個方法的存在,就表示可以哈希 2、__hash__ = None 在類中加上上面一行,類名就不可哈希,可變的,不能作為字典的key 註意點:這裡是 =賦值 而不是==值的判斷 八、__str__() 方法 1、__str__() 方法是Boy的父類object的方法,如果子類不重寫的話 列印對象,就是列印對象的記憶體地址 2、子類重寫__str__() 方法後 再次列印對象,就可以不輸出對象的記憶體地址,而是自定義輸出了 3、註意點: __str__() 方法的返回值的類型必須是字元串,而不能是元組,否則會報錯 九、__new__(cls)方法 創建對象的步驟 1、載入類 2、開闢記憶體空間:通過__new__(cls)方法 3、創建對象: 通過__new__(cls)方法的返回值 object.__new__(cls)來創建對象 註意點:__new__()的參數是cls類,而不是對象(因為現在對象還沒有創建出來) 4、初始化對象: 創建對象的過程中,自動調構造方法__init__(),初始化對象 把成員變數封裝到對象中,就是初始化對象 5、使用對象: 1、列印對象 2、對象調成員方法 3、對象調成員變數