程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

讓python飛:形象理解python封裝、繼承、函數重寫、類屬性、對象屬性、類函數、對象函數、序列化、反序列化、pickle

編輯:Python


Day12大呲花參觀姚明汽車廠
聽聞姚明在美國辦了個車廠,上海煙花廠的一箱炮竹不淡定了。他們決定要去向姚老板祝賀。所以,他們決定把自己封裝在一個集裝箱裡走海運去美國。
到達美國後,姚明熱情的接待了他們。有個叉車跑過來告訴姚老板,有個客戶覺得車座太小,想換一個大的,結果換的那個太大,就放在車頂上去了,現在跑在街上巨丑無比。姚老板一聽這哪行啊。我們送給客戶的構造機也不能瞎用啊。這得設置一些條件,不能讓他們隨意設置東西
(在設計完類,外界創建對象通過.的形式訪問(設置)屬性,可能會出現跟現實情況不符的混亂數據,那麼我們就將屬性的設置權沒收(外界不能直接通過.調用屬性))大呲花說,這好辦啊,在大鐵架下方放一個大袋鼠,把客戶的要求放進袋鼠的袋子裡進行判斷,讓那些符合條件的配置要求通過,其他的不讓通過

在類的內部提供外界額外的訪問方式(定義setter和getter方法),並且在需要的時候,可以在函數的內部加入數據合法性的校驗;對於setter函數,命名:set屬性名(首字母大寫)
設置值(__age):
def setAge(self,age):
self.__age = age

袋鼠還可以把紙條拿出來進行閱讀

對於getter函數,命名:get屬性名(首字母大寫)
獲取值(__age):
def getAge(self):
return self.__age

姚明一聽,對此表示贊同!
這時,一輛大象車呼嘯而過,大呲花給嚇壞了。姚明告訴他,這輛車就是從他的廠生產出來的車改造的。論輩分,他得叫我的車叫爸爸
(兩部分組成,一部分我們稱為父類(基類、超類、superclass),另一部分我們稱為子類(派生類、subclass),子類可以使用父類中的成員(使用權))有的車只經過一次改造,成為單繼承車。

class Teacher(Person):
def __init__(self,name,age,salary):
print('我是teacher類的構造函數。。。')
self.salary = salary
#調用父類構造函數 目的:父類的屬性由父類自己賦值
#在子類構造函數中顯示的調用其父類構造
# super(Teacher,self).__init__(name,age)
# super().__init__(name,age)
Person.__init__(self,name,age)

這樣改造後的車既可以有父類的樣式,也有自己的樣式,既有父類的功能,也有自己的功能。
還有一種車經過多次改造,我們管這種車叫多重繼承車,它是單繼承車的延伸。還有一種車是吸取了多種風格改造出來的,我們把它叫多繼承車

from father import Father
from mother import Mother
'''
定義Child類同時繼承Father和Mother類
'''
class Child(Father,Mother):
def __init__(self,money,faceValue,work):
self.work = work
Father.__init__(self,money)
Mother.__init__(self,faceValue)

改造的時候,有的客戶對我們的車某些功能不太滿意,想改進一下,這個我們也是支持的。但是我們的名字不能改

函數重寫(override)前提:必須有繼承性
原因:
父類中的功能(函數),子類需要用,但是父類中函數的函數體內容和我現在要執行的邏輯還不相符
那麼可以將函數名保留(功能還是此功能,但是將函數體重構;
注意: 子類重寫父類的函數,除了函數體以外的部分,直接復制父類的即可)

大呲花問姚明這些改造車都是在哪加工的呢?姚明告訴大呲花,我們的廠裡生產時給車設置一些基本屬性,完了呢給它點功能

類函數:
格式:
@classmethod
def 函數名(cls,...)cls可以理解為當前類的類名

它到客戶手中,我們還給客戶配置了一個鐵架子,用來對車進行改造

(對象函數:格式: def 函數名(self,...)
self可以理解為當前對象或者正在被創建的對象)

兩者的關系是以客戶改造為主

類可以調用類(屬性、函數),不能調用對象(屬性、函數),對象可以調用類(屬性、函數),也能調用對象(屬性、函數)。我們可以用別的方式解決,方式如下:
先進行對象實例化 --> d = cls(100)
d就可以隨意的去訪問對象屬性和對象函數了)

大呲花開了輛車准備兜風,開完後,這輛車就被直接放到一個大的類似於水泥攪拌機的機器裡,從下面出來就變成了一箱紙。這個機器叫pickle,它有兩個口,上面有個進口叫dump(dump(obj, fr):將obj對象序列化到文件中(取決於fr中的path)),它能把車變成文字記錄在紙上。下面的小口叫load(load(fw):將fw(path中的數據)加載到程序,以對象返回)它能把一箱紙重新變成車。

#實例化Person對象
# p = Person('貂蟬',18,'女',162.0,84,'靓麗')
#
# fw = open(r'person.txt','wb')
#對象序列化操作:將程序中的對象p序列化到person.txt文件中保存起來
# pickle.dump(p,fw)
#
# fw.close()
# fr = open(r'person.txt','rb')
#對象反序列化操作:將person.txt中的二進制數據反序列化到程序中,還原成為一個Person對象
# p1 = pickle.load(fr)
# print(p1,type(p1))
#
# fr.close())

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved