python學習筆記6
面向對象編程(類):
編程範式:不同的編程範式特點進行歸納總結得出來的編程方式類別。
編程:特定的語法+數據結構+算法組成的代碼,使計算機執行任務。
程序:得到結果而編寫一組指令的集合。
編程範式主要分為:面向過程編程、面向對象編程、函數式編程
面向過程編程:程序一步步從上到下執行。解決問題思路,把問題逐漸劃分為小模塊或子程序,從而繼續劃分。
面向對象編程(OOP):利用類和對象來創建各種模型實現對真實世界的描述,便於維護和擴展。
面向對象特性:
Class 類:一個類即是對一類擁有相同屬性的對象的抽象、藍圖、原型(模板)。在類中定義了這些對象的都具備的屬性
(variables(data))、共同的方法。
Object 對象:一個類必須經過實例化後,方可在程序中調用,一個類可以實例化多個對象,每個對象亦可以有不同的屬性,
就像人類是指所有人,每個人是指具體的對象,人與人之前有共性,亦有不同。
Encapsulation 封裝:在類中對數據的賦值、內部調用對外部用戶是不可見的,這使類變成了一個膠囊或容器,裏面包含著類
的數據和方法。
Inheritance 繼承:一個類可以派生出子類,在這個父類裏定義的屬性、方法自動被子類繼承。
Polynorphism 多態:多態是面向對象的重要特性,簡單點說:“一個接口,多種實現”,指一個基類中派生出了不同的子類,
且每個子類在繼承了同樣的方法名的同時又對父類的方法做了不同的實現,這就是同一種事物表現出的多種形態。對不同類的對
象發出相同的消息將會有不同的行為。多態允許將子類的對象當作父類的對象使用,某父類型的引用指向其子類型的對象,調用
的方法是該子類型的方法。這裏引用和調用方法的代碼編譯前就已經決定了,而引用所指向的對象可以在運行期間動態綁定。
面對對象語法:
class Dog:#定義一個類Dog def __init__(self,name):#傳入名字,self.name,傳入參數,構造函數 self.name=name def bulk(self): print(‘%s:wang wang wang!‘%self.name) #定義類下的對象 dog1=Dog(name=‘yangjian‘) #調用方法 dog1.bulk()類
實例化:把一個類變成具體對象的過程叫做實例化。
實例變量用途:儲存實例的特有屬性
類變量用途:儲存類的共同屬性,省內存
面向對象編程實例2:
class Role(object): #Role類名 class_variable=22344#類變量,存在類的內存裏 name=‘mary‘ def __init__(self, name, role, weapon, life_value=100, money=15000): "構造函數:在實例化時做一些類的初始化工作" self.name = name#實例變量(靜態屬性),作用域為實例本身,存在實例的內存裏 self.role = role self.weapon = weapon self.cs example__life_value = life_value#私有屬性 self.money = money #__init_()開辟一個內存,保存其中的值 def __del__(self):#析構函數,不能傳參數,實例釋放或刪除時自動執行,不需要調用 print(‘實例釋放‘) def __shot(self):#類的方法,(動態屬性)#私有方法 print("shooting...") def show_states(self): print(‘name:%s ,life_value:%s‘%(self.name,self.__life_value)) self.__shot()#調用私有方法 def got_shot(self): print("ah...,I got shot...") def buy_gun(self, gun_name): print("just bought %s" % gun_name) print(Role.class_variable)#類變量不需要實例化就可以打印,已存在 r1 = Role(‘zhaoyun‘, ‘police‘, ‘AK47‘) #生成一個角色,實例化(初始化一個類),把一個類變成具體對象的過程叫做實例化,r1稱為Role的實例 r2 = Role(‘nvbu‘, ‘terrorist‘, ‘B22‘) #生成一個角色#相當於r2=Role(r2,‘Jack‘,‘terrorist‘,‘B22‘) r1.got_shot()#相當於Role.got_shot(r1) r1.buy_gun(‘AK47‘)#相當於Role.buy_gun(r1,‘AK47‘) print(r1.name)#查找實例變量時,優先從實例內存裏找,找不到時再從類內存裏找 r1.name=‘zhizhang‘#修改實例變量 print(r1.name)#查找實例變量時,優先從實例內存裏找,找不到時再從類內存裏找 print(r1.class_variable)#實例中也可以找到類變量 r1.body_armor=100#添加實例變量 print(r1.body_armor) del r1.body_armor#刪除實例變量 r1.class_variable=‘change self‘#在實例中添加或修改一個變量 Role.class_variable=‘change‘#修改類變量 print(r1.class_variable,‘---‘,r2.class_variable) #print(r1.__life_value)不能調用和打印 r1.show_states()
析構函數:在實例釋放或銷毀時自動執行,通常用於通常用於做一些收尾工作,如關閉一些數據庫鏈接、關閉打開的文件
私有方法:def __shot(self):pass 類方法前加兩個下劃線,變為私有方法,私有方法外部不能直接訪問,類內部可以訪問,
self.__private_methods內部調用
私有屬性(變量):self.__life_value,實例變量兩個下劃線開頭,聲明該屬性為私有,不能在類地外部被使用或直接訪問。
封裝:通過私有屬性和私有方法封裝.封裝,也就是把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的類或者
對象操作,對不可信的進行信息隱藏。
繼承:作用是省代碼。如果子類重寫了__init__ 時,實例化子類,就不會調用父類已經定義的 __init__。相同方法,優先調用子類,
父類不起作用。
如果重寫了__init__ 時,要繼承父類的構造方法,可以使用 super 關鍵字:
super(子類,self).__init__(參數1,參數2,....)
還有一種經典寫法:
父類名稱.__init__(self,參數1,參數2,...)
繼承順序:pyhon3廣度優先,優先找調用子類,然後父類,再查找上一級父類
在python2上,經典類為深度優先,一路查找到底;新式類為廣度優先。
繼承實例:
#class Books:#經典類 class Books(object):#定義父類,新式類:多繼承方式與經典類不同 def __init__(self,total_page_number,book_name):#父類構造函數,初始化 self.pnum = total_page_number self.name = book_name print(‘test call‘) def writing(self): print(‘half of %s page has been writing‘%self.pnum) def read(self): print(‘Today I read %s‘%self.name) class Knowledge_carrier(object): def __init__(self,carrier_type,total_page_number): self.carrier=carrier_type self.pnum = total_page_number def iscarrier(self,carrier): if self.carrier==carrier: print(True) else: print(‘other carrier‘) def writing(self): print(‘all of %s page has been writing‘%self.pnum) class Music_book(Books):#繼承,括號內填父類的名字 def __init__(self,total_page_number,book_name,music_type):#子類初始化,此時父類的初始化無效 super(Music_book, self).__init__(total_page_number,book_name) self.music_type = music_type def writing(self):#方法和屬性優先在子類中尋找,子類與父類存在相同時,調用子類方法。 #Books.writing(self)#調用父類的方法,經典類寫法 super(Music_book, self).writing()#作用與上同,新式類寫法 print(‘quarter of %s page has been writing‘%self.pnum) def play(self): print(‘play the %s music,remain half of %s pages‘%(self.music_type,self.pnum)) class Tech_book(Books):#繼承,括號內填父類的名字 def __init__(self,total_page_number,book_name,tech_type):#重構子類,需要加上所有的參數,包括調用的父類參數 super(Tech_book, self).__init__(total_page_number,book_name)#=books.__init__() self.tech_type=tech_type def make(self): print(‘An %s invention was made‘%self.tech_type) book1=Music_book(100,‘piano_book‘,‘piano‘) book1.play() book1.read() book1.writing() book2=Tech_book(200,‘A Brief History Of Time‘,‘Physics‘) book2.writing() book2.make() book2.read() print(book2.tech_type) #多繼承 class NewMusicBook(Knowledge_carrier,Books,):#繼承,括號內填父類的名字,多繼承 def __init__(self,total_page_number,book_name,music_type,carrier_type):#子類初始化,此時父類的初始化無效 #super(NewMusicBook, self).__init__(total_page_number,book_name,carrier_type) Books.__init__(self,total_page_number,book_name) Knowledge_carrier.__init__(self,carrier_type,total_page_number) self.music_type = music_type def writing(self):#方法和屬性優先在子類中尋找,子類與父類存在相同時,調用子類方法。 #books.writing(self)#調用父類的方法,經典類寫法 super(NewMusicBook, self).writing()#作用與上同,新式類寫法 print(‘quarter of %s page has been writing‘%self.pnum) def play(self): print(‘play the %s music,remain half of %s pages‘%(self.music_type,self.pnum)) NewBook=NewMusicBook(300,‘songs‘,‘classic‘,‘electric‘) NewBook.writing()#多繼承時調用父類方法,優先調用括號裏父類從左往右含有的第一個 NewBook.read() NewBook.play() NewBook.iscarrier(‘paper‘)inheritance_Book_eg
1 class School(object): 2 def __init__(self,name,addr): 3 self.name=name 4 self.addr=addr 5 self.staffs=[] 6 self.students=[] 7 def enroll(self,stu_obj): 8 print(‘為學員%s辦理註冊手續‘%stu_obj.name) 9 self.students.append(stu_obj) 10 def hire(self,staff_obj): 11 self.staffs.append(staff_obj) 12 print(‘雇傭新員工%s‘%staff_obj.name) 13 class SchoolMember(object): 14 def __init__(self,name,age,sex): 15 self.name=name 16 self.age=age 17 self.sex=sex 18 def school_card(self): 19 print(‘Hello, %s. You can use the campus card to spend‘%self.name) 20 class Teacher(SchoolMember): 21 def __init__(self,name,age,sex,salary,course): 22 super(Teacher,self).__init__(name,age,sex) 23 self.salary=salary 24 self.course=course 25 def tell(self): 26 print(‘‘‘ 27 -----info of teacher %s------ 28 name:%s 29 age:%s 30 sex:%s 31 salary:%s 32 course:%s 33 ‘‘‘%(self.name,self.name,self.age,self.sex,self.salary,self.course) 34 ) 35 def teach(self): 36 print(‘%s is teaching course [%s]‘%(self.name,self.course)) 37 class Student(SchoolMember): 38 def __init__(self,name,age,sex,stu_id,grade): 39 super(Student, self).__init__(name,age,sex) 40 self.stu_id=stu_id 41 self.grade=grade 42 def tell(self): 43 print(‘‘‘ 44 -----info of student %s------ 45 name:%s 46 age:%s 47 sex:%s 48 stu_id:%s 49 grade:%s 50 ‘‘‘%(self.name,self.name,self.age,self.sex,self.stu_id,self.grade) 51 ) 52 def pay_tuition(self,amout,teacher): 53 print(‘%s has paid %s¥ tuition for course [%s] ‘ 54 %(self.name,amout,teacher.course)) 55 school=School(‘XiaMen university‘,‘XiaMem‘) 56 t1=Teacher(‘tusong‘,40,‘M‘,‘20000‘,‘Chemistry‘) 57 t2=Teacher(‘xugou‘,30,‘F‘,30000,‘economics‘) 58 s1=Student(‘wangdasha‘,23,‘M‘,1234144,2013) 59 s2=Student(‘guodong‘,23,‘M‘,2345613,2013) 60 school.hire(t1) 61 school.hire(t2) 62 school.enroll(s1) 63 school.enroll(s2) 64 t1.school_card() 65 t2.school_card() 66 s1.school_card() 67 s2.school_card() 68 t1.tell() 69 t1.teach() 70 s1.tell() 71 s1.pay_tuition(5000,t1) 72 t2.tell() 73 t2.teach() 74 s2.tell() 75 s2.pay_tuition(6000,t2) 76 print(school.staffs) 77 print(school.students) 78 for i in school.students: 79 i.pay_tuition(5000,t1)inheritance_eg2_School
多態:多態則是為了實現另一個目的——接口重用。允許將子類類型的指針賦值給父類類型的指針。一個接口,多種實現。
封裝可以隱藏實現細節,使得代碼模塊化;繼承可以擴展已存在的代碼模塊(類);它們的目的都是為了——代碼重用。而多態則是為了實現另一個目 的——接口重用!
多態實例:
class Animal(object): def __init__(self, name): # Constructor of the class self.name = name def talk(self): # Abstract method, defined by convention only raise NotImplementedError("Subclass must implement abstract method") class Cat(Animal): def talk(self): print(‘%s: 喵喵喵!‘ % self.name) class Dog(Animal): def talk(self): print(‘%s: 汪!汪!汪!‘ % self.name) def func(obj): # 一個接口,多種形態 obj.talk() c1 = Cat(‘趙雲‘) d1 = Dog(‘周瑜‘) func(c1) func(d1)polynorphism
領域建模的三字經方法:找名詞、加屬性、連關系。
python學習筆記6