面向對象編程
OOP編程是利用「類」和「對象」來建立各類模型來實現對真實世界的描述,使用面向對象編程的緣由一方面是由於它能夠使程序的維護和擴展變得更簡單,而且能夠大大提升程序開發效率 ,另外,基於面向對象的程序能夠使它人更加容易理解你的代碼邏輯,從而使團隊開發變得更從容。python
面向對象的幾個核心特性以下編程
Class 類
一個類便是對一類擁有相同屬性的對象的抽象、藍圖、原型。在類中定義了這些對象的都具有的屬性(variables(data))、共同的方法app
Object 對象
一個對象便是一個類的實例化後實例,一個類必須通過實例化後方可在程序中調用,一個類能夠實例化多個對象,每一個對象亦能夠有不一樣的屬性,就像人類是指全部人,每一個人是指具體的對象,人與人以前有共性,亦有不一樣函數
Encapsulation 封裝
在類中對數據的賦值、內部調用對外部用戶是透明的,這使類變成了一個膠囊或容器,裏面包含着類的數據和方法ui
Inheritance 繼承
一個類能夠派生出子類,在這個父類裏定義的屬性、方法自動被子類繼承
python2 中,經典類按照深度優先進行繼承,新式類按照廣度優先進行繼承
python3中,經典類和新式類均按照廣度優先進行繼承code
Polymorphism 多態
多態是面向對象的重要特性,簡單點說:「一個接口,多種實現」,指一個基類中派生出了不一樣的子類,且每一個子類在繼承了一樣的方法名的同時又對父類的方法作了不一樣的實現,這就是同一種事物表現出的多種形態。
編程其實就是一個將具體世界進行抽象化的過程,多態就是抽象化的一種體現,把一系列具體事物的共同點抽象出來, 再經過這個抽象的事物, 與不一樣的具體事物進行對話。
對不一樣類的對象發出相同的消息將會有不一樣的行爲。好比,你的老闆讓全部員工在九點鐘開始工做, 他只要在九點鐘的時候說:「開始工做」便可,而不須要對銷售人員說:「開始銷售工做」,對技術人員說:「開始技術工做」, 由於「員工」是一個抽象的事物, 只要是員工就能夠開始工做,他知道這一點就好了。至於每一個員工,固然會各司其職,作各自的工做。
多態容許將子類的對象看成父類的對象使用,某父類型的引用指向其子類型的對象,調用的方法是該子類型的方法。這裏引用和調用方法的代碼編譯前就已經決定了,而引用所指向的對象能夠在運行期間動態綁定。對象
構造函數:
def init(self,name,age):# self 類實例化後將對象自己做爲self參數傳入
self.name = nameblog
析構函數:
def del(self): #用於刪除實例對象,釋放空間
print('...')繼承
私有屬性:
def init(self,name,age):
self.__name = name #僅供對象的內部方法調用,若是外部方法須要讀取私有屬性的內容,須要在類的內部定義新的方法進行調用
私有方法:
def __life_value(self): # 方法名稱前面有兩根下劃線,僅供內部方法調用接口
__author__ = 'Administrator' #class SchoolMember: #經典類 python2.x class SchoolMember(object): #新式類 members = 0 #初始學校人數爲0 def __init__(self,name,age): self.name = name self.age = age def tell(self): pass def enroll(self): '''註冊''' SchoolMember.members +=1 print("\033[32;1mnew member [%s] is enrolled,now there are [%s] members.\033[0m " %(self.name,SchoolMember.members)) def __del__(self): '''析構方法''' pass #print("\033[31;1mmember [%s] is dead!\033[0m" %self.name) class Relation(object): def make_friends(self,obj): print('%s is making frinds with %s'%(self.name,obj.name)) self.friends.append(obj) #將一個對象obj寫入列表 class Teacher(SchoolMember): def __init__(self,name,age,course,salary): #SchoolMember.__init__(self,name,age) #經典類的寫法 super(Teacher,self).__init__(name,age) #主要是爲了便於基類名稱的修改,以及多繼承減小重複__init__ self.course = course self.salary = salary self.enroll() def teaching(self): '''講課方法''' print("Teacher [%s] is teaching [%s] for class [%s]" %(self.name,self.course,'s12')) def tell(self): '''自我介紹方法''' msg = '''Hi, my name is [%s], works for [%s] as a [%s] teacher !''' %(self.name,'Oldboy', self.course) print(msg) class Student(SchoolMember,Relation): #多繼承 def __init__(self, name,age,grade,sid): super(Student,self).__init__(name,age) self.grade = grade self.sid = sid self.enroll() self.friends =[] def tell(self): '''自我介紹方法''' msg = '''Hi, my name is [%s], I'm studying [%s] in [%s]!''' %(self.name, self.grade,'Oldboy') print(msg) if __name__ == '__main__': t1 = Teacher("Alex",22,'Python',20000) t2 = Teacher("TengLan",29,'Linux',3000) s1 = Student("Qinghua", 24,"Python S12",1483) s2 = Student("SanJiang", 26,"Python S12",1484) t1.teaching() t2.teaching() t1.tell() s1.make_friends(s2) s2.name ='Wang ...'#修改對象s2的姓名 print(s1.friends[0].name)#打印列表中第一個元素(對象s2)的屬性name
類實例對象及繼承練習:
__author__ = 'admin' class School(object): def __init__(self,name,addr): self.name = name self.addr = addr self.students =[] self.staffs =[] def enroll(self,stu_obj): print('welcome new student:%s'%stu_obj.name) self.students.append(stu_obj) def hire(self,teacher_obj): print('welcome new staff:%s'%teacher_obj.name) self.staffs.append(teacher_obj) class SchoolMember(object): def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex def tell(self): pass class Teacher(SchoolMember): def __init__(self,name,age,sex,salary,course): super(Teacher,self).__init__(name,age,sex) self.salary = salary self.course = course def tell(self): print('''----the info of teacher:%s name:%s age:%s sex:%s salary:%s course:%s '''%(self.name,self.name,self.age,self.sex,self.salary,self.course)) def teach(self): print('%s is teaching course %s'%(self.name,self.course)) class Student(SchoolMember): def __init__(self,name,age,sex,stu_id,grade): super(Student,self).__init__(name,age,sex) self.stu_id = stu_id self.grade = grade def tell(self): print('''----the info of student:%s name:%s age:%s sex:%s stu_id:%s grade:%s '''%(self.name,self.name,self.age,self.sex,self.stu_id,self.grade)) def pay_tuition(self,amount = 5000): print('%s has paid tuition $ %s'%(self.name,amount)) school = School('oldboyedu','Beijing') t1 = Teacher('oldboy',37,'M',80000,'Linux') t2 = Teacher('alex',26,'M',30000,'Python') s1 = Student('Wang1',18,'F',1001,3) s2 = Student('Li1',19,'M',1002,5) print(school.name,school.addr) school.hire(t1) school.hire(t2) school.enroll(s1) school.enroll(s2) t1.tell() s2.tell() s1.pay_tuition(999) t2.teach() school.staffs[0].teach() for i in school.students: i.pay_tuition()