標籤:orm 記憶體 imp 簡單的 ken 運行時 兩種 col 瞭解
一、物件導向簡介
Python設計之初,就是一門物件導向的語言,在Python中一切皆對象,而且在Python中建立一個對象也很簡單,今天我們就來學習一下Python的物件導向的知識。
二、兩種編程方式
在C#、Java中,只能使用物件導向編程,在Ruby、Python中可以使用函數編程以及物件導向進行編程。
函數式編程
def fetch(backend): passdef add_record(backend,record): passfetch("www.oldboy.org")add_record("www.oldboy.org",xxxxx)
物件導向編程
class Oldboy:#類,用來封裝幾個函數 def fetch(self,backend):#self是python內部傳的,使用者我們傳值時 pass #傳的第一個參數直接給backend def add_record(self,backend,record): passobj = Oldboy()obj.fetch()
函數在類的外面就叫做函數,在類的裡面就叫做方法,物件導向的情況下想要執行函數時需要根據這個類建立一個對象,通過對象訪問函數。
一般函數式編程的函數為模組的成員,而物件導向編程,類是模組的成員,函數是類的成員。
物件導向的程式設計的核心是對象(上帝式思維),要理解對象為何物,必須把自己當成上帝,上帝眼裡世間存在的萬物皆為對象,不存在的也可以創造出來。對象是特徵和技能的結合,其中特徵和技能分別對應對象的資料屬性和方法屬性。
優點是:解決了程式的擴充性。對某一個對象單獨修改,會立刻反映到整個體系中,如對遊戲中一個人物參數的特徵和技能修改都很容易。
缺點:可控性差,無法向面向過程的程式設計流水線式的可以很精準的預測問題的處理流程與結果,物件導向的程式一旦開始就由對象之間的互動解決問題,即便是上帝也無法預測最終結果。於是我們經常看到一個遊戲人某一參數的修改極有可能導致陰霸的技能出現,一刀砍死3個人,這個遊戲就失去平衡。
三、物件導向深度解析
1.關於self的解析
2.封裝
class Oldboy: def fetch(self): print(self.backend)#因為參數self傳的值為對象obj1,所以可以用self代替obj1 def add_record(self,record): passobj1 = Oldboy()obj1.backend = "alexsel"#這個參數,和obj1一起被存入記憶體#封裝的非主流的方式obj1.fetch()#由於backend和obj1一起存入記憶體,所以不用再吧backend傳過去,直接 #在函數裡用self.backend使用obj2 = Oldboy()obj2.backend = "ALEXSEL"obj2.fetch()
這裡也顯示出了self的作用,self可以標識對象,由於給兩個對象傳入的參數輸不同,調用類的方法的時候,輸出的內容就不同,這就是self的功能。
應用:
當有幾個函數要傳的參數相同時,封裝比較簡便
3.構造方法__init__
當使用類建立對象的時候(obj = Foo()),預設執行__init__方法
class Foo: def __init__(self, bk): ##這個self為建立的對象,建立對象時預設執行__init__ print("init") ##所以可把需要多次傳的參數在這裡建立,代替上面那個 self.name = "alex" ##非主流的方法 self.favor = bk print(self.favor)# 建立對象,執行個體,並將“xxx”封裝到對象裡obj1 = Foo("xxx") # 建立對象時,類裡就會執行__init__方法(函數),這個xxx就傳入到__init__的bk參數中obj2 = Foo("sss")輸出結果:initxxxinitsss
使用情境:當同一類型的的方法具有相同的參數時,直接封裝到對象即可。
使用情境:把類當成模板,建立多個對象(對象內封裝的資料可以不一樣)。
四、上手練習
針對剛才瞭解的知識,我們進行一個簡單的練習,輸出同樣的結果下,不同的兩種寫法,熟悉類中方法和屬性的使用。
寫法一:
class activity: def __init__(self,name,age,gender): self.FlyAnAeroplane = "{:s},{:s},{:s},去開飛機".format(name,age,gender) self.GoToSchool = "{:s},{:s},{:s},去學校".format(name,age,gender) self.Farm = "{:s},{:s},{:s},去種田".format(name,age,gender) def FlyAnAeroplane_one(self): print(self.FlyAnAeroplane) def GoToSchool_one(self): print(self.GoToSchool) def Farm_one(self): print(self.Farm)obj = activity("alexsel","10","男")obj.FlyAnAeroplane_one()obj.GoToSchool_one()obj.Farm_one()obj2 = activity("eric","60","男")obj2.FlyAnAeroplane_one()obj2.GoToSchool_one()obj2.Farm_one()輸出結果:alexsel,10,男,去開飛機alexsel,10,男,去學校alexsel,10,男,去種田eric,60,男,去開飛機eric,60,男,去學校eric,60,男,去種田
寫法二:
class Foo: def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender def kaifeiji(self): print("%s,%s歲,%s,去開飛機" % (self.name, self.age, self.gender)) def quxuexiao(self): print("%s,%s歲,%s,去學校" % (self.name, self.age, self.gender)) def quzhongtian(self): print("%s,%s歲,%s,去種田" % (self.name, self.age, self.gender))alexsel = Foo(‘alexsel‘, 10, ‘男‘)alexsel.kaifeiji()alexsel.quxuexiao()alexsel.quzhongtian()eric = Foo(‘eric‘, 90, ‘男‘)eric.kaifeiji()eric.quxuexiao()eric.quzhongtian()輸出結果:alexsel,10歲,男,去開飛機alexsel,10歲,男,去學校alexsel,10歲,男,去種田eric,90歲,男,去開飛機eric,90歲,男,去學校eric,90歲,男,去種田
五、項目練習
在寫這個項目之前,我們首先學習一下pickel模組。
pickle可以將任何資料類型序列化,pickle只能在python中使用,pickle模組用於將記憶體中的python對象序列化成位元組流,並可以寫入任何類似檔案對象中;它也可以根據序列化的位元組流進行還原序列化,將位元組流還原為記憶體中的對象。
pickle使用dump方法將記憶體對象序列化:
import pickleli = list(range(1,3))dbfile = open(‘pickle_list‘, ‘wb‘) #必須以2進位開啟檔案,否則pickle無法將對象序列化只檔案pickle.dump(li, dbfile)dbfile.close()
以上代碼即將list對象li序列化至檔案“pickle_list"中,下次再次運行時,可以通過pickle的load方法恢複list對象:
import pickledbfile = open(‘pickle_list‘, ‘rb‘)li = pickle.load(dbfile)dbfile.close()
開始項目練習
import pickleclass Person: def __init__(self,name,age,weight): self.Name = name self.Age = age self.Weight = weight def eat(self): self.Weight = self.Weight + 2 #每次吃飯,體重加1 def fitness(self): self.Weight = self.Weight - 1 #每次健身,體重減1xiaoming = pickle.load(open("fitnessgame.obb","rb"))if xiaoming: #判斷是否有小明這個對象,沒有建立小明對象 print(xiaoming.Weight) xiaoming.fitness() xiaoming.fitness() xiaoming.fitness() print(xiaoming.Weight) pickle.dump(xiaoming,open("fitnessgame.obb","wb"))else: xiaoming = Person("小明","10歲",200) xiaoming.fitness() xiaoming.eat() xiaoming.eat() xiaoming.eat() xiaoming.eat() print(xiaoming.Weight) pickle.dump(xiaoming,open("fitnessgame.obb","wb"))
明天我們接著講物件導向,明天繼續講物件導向中的繼承。
Python學習:14.Python物件導向(一)