標籤:lis ash 物件導向 資料類型 init self _id 內建函數 user
1.多態
多態的概念雖然現在才說,但是我們一直在用。多態就是多種形態的意思,動物都貓,狗,豬等等,這些都是動物的多種形態。
反映在Python中,多態就意味著就算不知道變數所引用的物件類型是什麼,也能對它進行操作。比如序列類型有計算長度的方法len(),那我們拿到一個序列類型x,我們不需要知道x是什麼類型,只需要知道它是序列類型,那我們就可以用len(x)的方法計算x的長度。這就是多態性
當然我們學過一個內建函數isinstance(),可以用它來判斷資料類型,但是這可不符合多態優美的特性
2.Binder 方法與非Binder 方法
類裡面定義的函數有兩種,Binder 方法和非Binder 方法
1)Binder 方法
Binder 方法又分為綁定給類的方法和綁定給對象用的方法。
凡是定義在類中,且沒有被任何裝飾器修飾的方法,都是綁定給對象用的方法。
特點是obj.func()會自動把obj當作第一個參數傳入,因為func的邏輯就是要處理obj
在類中定義的被classmethod裝飾器修飾的方法,就是綁定給類的方法
特點是cls.func()會自動把類cls當作第一個參數傳入,因為func的邏輯是處理cls,就算是對象調用這個函數,也是把類當成第一個參數傳入
class People: def __init__(self,name): self.name=name def bar(self): print(‘----->‘,self.name) @classmethod def func(cls): print(cls)p1=People(‘zhang‘)p1.func() #<class ‘__main__.People‘>People.func()#<class ‘__main__.People‘>
2)非Binder 方法
還有一種方法是既不綁定給類,也不綁定給對象的,叫做非Binder 方法
用staticmethod裝飾器裝飾
#檔案名稱:pickle_testimport hashlibimport timeimport pickleimport osstudent_path=r‘C:\Users\Administrator\PycharmProjects\python5期\day22\student‘class People: def __init__(self,name,sex,user_id): self.name=name self.sex=sex self.user_id=user_id self.id = self.create_id() def tell_info(self): print(‘‘‘ --------%s info-------- id:%s name:%s sex:%s user_id:%s ‘‘‘ %(self.name,self.id,self.name,self.sex,self.user_id)) def create_id(self): m=hashlib.md5() m.update(self.name.encode(‘utf-8‘)) m.update(self.sex.encode(‘utf-8‘)) m.update(str(self.user_id).encode(‘utf-8‘)) return m.hexdigest() def save(self): with open(self.id,‘wb‘) as f: pickle.dump(self,f) @staticmethod #非Binder 方法,就是一個函數,就是一個工具而已,不需要類,也不需對象 def get_all(): res = os.listdir(student_path) for item in res: file_path=r‘%s\%s‘ %(student_path,item) with open(file_path,‘rb‘) as f: obj=pickle.load(f) obj.tell_info()#還原序列化.pyfrom pickle_test import Peoplep=People(‘egon‘,‘male‘,123123123)p.get_all()
3.軟體開發規範
在真正的軟體開發過程中,並不是把所有代碼寫在一個檔案中的,可以想象一下,一個小程式大概有10000行代碼,都寫在一個檔案中的話,你還幹這行嗎?
正確的方式應該是把程式拆成一個一個模組。比如常用的bin目錄放可執行檔,conf目錄放設定檔
db目錄放資料,log目錄放記錄檔,lib目錄放庫,src目錄放一些重要的代碼,比如重要的邏輯,類的定義等
Python物件導向編程(四)