python 入門第六課 class面向物件OOP
面向物件程式設計
OOP程式設計是利用“類”和“物件”來建立各種模型來實現對真實世界的描述,使用面向物件程式設計的原因一方面是因為它可以使程式的維護和擴充套件變得更簡單,並且可以大大提高程式開發效率 ,另外,基於面向物件的程式可以使它人更加容易理解你的程式碼邏輯,從而使團隊開發變得更從容。
面向物件的幾個核心特性如下
Class 類
一個類即是對一類擁有相同屬性的物件的抽象、藍圖、原型。在類中定義了這些物件的都具備的屬性(variables(data))、共同的方法
Object 物件
一個物件即是一個類的例項化後例項,一個類必須經過例項化後方可在程式中呼叫,一個類可以例項化多個物件,每個物件亦可以有不同的屬性,就像人類是指所有人,每個人是指具體的物件,人與人之前有共性,亦有不同
Encapsulation 封裝
在類中對資料的賦值、內部呼叫對外部使用者是透明的,這使類變成了一個膠囊或容器,裡面包含著類的資料和方法
Inheritance 繼承
一個類可以派生出子類,在這個父類裡定義的屬性、方法自動被子類繼承
python2 中,經典類按照深度優先進行繼承,新式類按照廣度優先進行繼承
python3中,經典類和新式類均按照廣度優先進行繼承
Polymorphism 多型
多型是面向物件的重要特性,簡單點說:“一個介面,多種實現”,指一個基類中派生出了不同的子類,且每個子類在繼承了同樣的方法名的同時又對父類的方法做了不同的實現,這就是同一種事物表現出的多種形態。
程式設計其實就是一個將具體世界進行抽象化的過程,多型就是抽象化的一種體現,把一系列具體事物的共同點抽象出來, 再通過這個抽象的事物, 與不同的具體事物進行對話。
對不同類的物件發出相同的訊息將會有不同的行為。比如,你的老闆讓所有員工在九點鐘開始工作, 他只要在九點鐘的時候說:“開始工作”即可,而不需要對銷售人員說:“開始銷售工作”,對技術人員說:“開始技術工作”, 因為“員工”是一個抽象的事物, 只要是員工就可以開始工作,他知道這一點就行了。至於每個員工,當然會各司其職,做各自的工作。
多型允許將子類的物件當作父類的物件使用,某父型別的引用指向其子型別的物件,呼叫的方法是該子型別的方法。這裡引用和呼叫方法的程式碼編譯前就已經決定了,而引用所指向的物件可以在執行期間動態繫結。
建構函式:
def init(self,name,age):# self 類例項化後將物件本身作為self引數傳入
self.name = name
解構函式:
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()