您好,登錄后才能下訂單哦!
本文實例講述了Python3.5面向對象程序設計之類的繼承和多態。分享給大家供大家參考,具體如下:
1、繼承的定義
繼承是指:可以使用現有類的所有功能,并在無需重新編寫原來的類的情況下對這些功能進行擴展。
(1)通過繼承創建的新類稱為“子類”或“派生類”。
(2)被繼承的類稱為“基類”、“父類”或“超類”。
繼承的過程,就是從一般到特殊的過程。要實現繼承,可以通過“繼承”(Inheritance)和“組合”(Composition)來實現。
在某些 OOP 語言中,一個子類可以繼承多個基類。但是一般情況下,一個子類只能有一個基類,要實現多重繼承,可以通過多級繼承來實現。
2、繼承的分類
繼承概念的實現方式主要有2類:實現繼承、接口繼承。
(1) 實現繼承是指使用基類的屬性和方法而無需額外編碼的能力;
(2)接口繼承是指僅使用屬性和方法的名稱、但是子類必須提供實現的能力(子類重構父類方法);
在考慮使用繼承時,有一點需要注意,那就是兩個類之間的關系應該是“屬于”關系。
抽象類僅定義將由子類創建的一般屬性和方法。
OO開發范式大致為:劃分對象→抽象類→將類組織成為層次化結構(繼承和合成) →用類與實例進行設計和實現幾個階段。
3、示例代碼
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author:ZhengzhengLiu #類的繼承 class People: def __init__(self,name,age): self.name = name self.age = age def eat(self): print("%s is eating..." %self.name) def sleep(self): print("%s is sleeping..." %self.name) def talk(self): print("%s is talking..." %self.name) class Man(People): #繼承父類People類 def make_money(self): print("%s is making money..." %self.name) def sleep(self): People.sleep(self) #對父類方法的擴展 print("man is sleeping...") class Women(People): def shop(self): print("%s is shopping..." %self.name) m1 = Man("Jack","20") m1.eat() m1.make_money() m1.sleep() w1 = Women("Amy","25") w1.talk() w1.shop()
運行結果:
Jack is eating...
Jack is making money...
Jack is sleeping...
man is sleeping...
Amy is talking...
Amy is shopping...
4、子類中對父類的構造函數進行重構兩種方法
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author:ZhengzhengLiu #類的繼承 #class People: #經典類 class People(object): #新式類 def __init__(self,name,age): self.name = name self.age = age def eat(self): print("%s is eating..." %self.name) def sleep(self): print("%s is sleeping..." %self.name) def talk(self): print("%s is talking..." %self.name) class Man(People): #繼承父類People類 def __init__(self,name,age,money): #People.__init__(self,name,age) #(方法一)對構造函數進行重構、添加父類中沒有的屬性 super(Man,self).__init__(name,age) #(方法二)利用super對構造函數進行重構(新式類寫法) self.money = money print("%s have money %s$" %(self.name,self.money)) def make_money(self): print("%s is making money..." %self.name) def sleep(self): People.sleep(self) #對父類方法的擴展 print("man is sleeping...") class Women(People): def shop(self): print("%s is shopping..." %self.name) m1 = Man("Jack","20",10) m1.eat() m1.make_money() m1.sleep() w1 = Women("Amy","25") w1.talk() w1.shop()
運行結果:
J ack have money 10$
Jack is eating...
Jack is making money...
Jack is sleeping...
man is sleeping...
Amy is talking...
Amy is shopping...
5、多繼承方式
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author:ZhengzhengLiu #類的繼承 #class People: #經典類 class People(object): #新式類 def __init__(self,name,age): self.name = name self.age = age self.friends = [] def eat(self): print("%s is eating..." %self.name) def sleep(self): print("%s is sleeping..." %self.name) def talk(self): print("%s is talking..." %self.name) class Relationship(object): def make_friends(self,obj): print("%s is making friends with %s" %(self.name,obj.name)) self.friends.append(obj) class Man(People,Relationship): #多繼承 def __init__(self,name,age,money): #People.__init__(self,name,age) #(方法一)對構造函數進行重構、添加父類中沒有的屬性 super(Man,self).__init__(name,age) #(方法二)利用super對構造函數進行重構(新式類寫法) self.money = money print("%s have money %s$" %(self.name,self.money)) def make_money(self): print("%s is making money..." %self.name) def sleep(self): People.sleep(self) #對父類方法的擴展 print("man is sleeping...") class Women(People,Relationship): #多繼承 def shop(self): print("%s is shopping..." %self.name) m1 = Man("Jack","20",10) w1 = Women("Amy","25") m1.make_friends(w1) w1.name = "liu" print(m1.friends)
運行結果:
Jack have money 10$
Jack is making friends with Amy
[<__main__.Women object at 0x0057FA30>]
6、新式類與經典類的繼承順序
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author:ZhengzhengLiu class A(object): #新式類 def __init__(self): print("A") class B(A): def __init__(self): print("B") class C(A): def __init__(self): print("C") class D(B,C): def __init__(self): pass #print("D") obj = D()
7、繼承示例——學校、教師與學生
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author:ZhengzhengLiu #繼承實例(新式類)——模擬學校、教師與學生 class School(object): def __init__(self,name,addr): self.name = name self.addr = addr self.students = [] self.stuffs = [] def enroll(self,stu_obj): #學生注冊 print("%s 學員辦理注冊" %stu_obj.name) self.students.append(stu_obj) def heir(self,staff_obj): #聘請教師 print("聘請教師 %s" %staff_obj.name) self.stuffs.append(staff_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(''' ----- 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(''' ----- 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): print("%s has paied tuition for $%s" %(self.name,amount)) #實例化 school = School("qinghua","beijing") t1 = Teacher("Jack","30","M","20000","Python") t2 = Teacher("Amy","28","F","15000","Linux") s1 = Student("liu","23","M","1701","Python") s2 = Student("wang","25","F","1702","Linux") #調用顯示學生與教師的信息 t1.tell() s1.tell() school.heir(t1) #聘請教師t1 school.enroll(s1) #學生s1注冊 school.enroll(s2) print(school.stuffs) print(school.students) #聘請的第一位教師教課 school.stuffs[0].teach() for stu in school.students: stu.pay_tuition(5000)
運行結果:
----- info of Teacher:Jack -----
Name:Jack
Age:30
Sex:M
Salary:20000
Course:Python
----- info of Student:liu -----
Name:liu
Age:23
Sex:M
Stu_id:1701
Grade:Python
聘請教師 Jack
liu 學員辦理注冊
wang 學員辦理注冊
[<__main__.Teacher object at 0x0059FDB0>]
[<__main__.Student object at 0x0059FDF0>, <__main__.Student object at 0x0059FE10>]
Jack is teaching course [Python]
liu has paied tuition for $5000
wang has paied tuition for $5000
8、多態(polymorphisn)——一種接口,多種形態
(1)定義
多態性(polymorphisn)是允許你將父對象設置成為和一個或更多的他的子對象相等的技術,
賦值之后,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作。
簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。
多態的作用:我們知道,封裝可以隱藏實現細節,使得代碼模塊化;繼承可以擴展已存在的代碼模塊(類);它們的目的都是為了——代碼重用。
而多態則是為了實現另一個目的——接口重用!多態的作用,就是為了類在繼承和派生的時候,保證使用“家譜”中任一類的實例的某一屬性時的正確調用。
Pyhon 很多語法都是支持多態的,比如 len(),sorted(), 你給len傳字符串就返回字符串的長度,傳列表就返回列表長度。
(2)示例代碼:
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author:ZhengzhengLiu class Animal(object): def __init__(self,name): self.name = name def talk(self): raise NotImplementedError("Subclass must implement abstract method") # 多態——一種接口,多種形態 @staticmethod def animal_talk(obj): obj.talk() class Cat(Animal): def talk(self): print("%s Meow!" %self.name) class Dog(Animal): def talk(self): print("%s Woof! Woof!" % self.name) d = Dog("A") #d.talk() c = Cat("B") #c.talk() #多態 Animal.animal_talk(d) Animal.animal_talk(c)
運行結果:
A Woof! Woof!
B Meow!
9、面向對象設計利器——領域建模
(1)定義
從領域模型開始,我們就開始了面向對象的分析和設計過程,可以說,領域模型是完成從需求分析到面向 對象設計的一座橋梁。
領域模型,顧名思義,就是需求所涉及的領域的一個建模,更通俗的講法是業務模型。
(2)領域模型有兩個主要的作用:
發掘重要的業務領域概念
建立業務領域概念之間的關系
(3)領域建模三字經
領域模型如此重要,領域建模的方法概括一下就是“找名詞”! 即使是簡單的找名詞這樣的操作,也涉及到分析和提煉,而 不是簡單的摘取出來就可,
這種情況下分析師和設計師的經驗和技能就能夠派上用場了。但領域模型分析 也確實相對簡單,即使沒有豐富的經驗和高超的技巧,至少也能完成一個能用的領域模型。
一個關鍵的問題:從哪里找? 因為領域模型是“需求到面向對象的橋梁”,能想到:從需求模型中找,具體來說就是從用例中找。
歸納:領域建模的方法就是“從用例中找名詞”。 當然,找到名詞后,為了能夠更加符合面向對象的要求和特點。
我們還需要對這些名詞進一步完善,這就 是接下來的步驟:加屬性,連關系!
最后我們總結出領域建模的三字經方法:找名詞、加屬性、連關系。
更多關于Python相關內容感興趣的讀者可查看本站專題:《Python面向對象程序設計入門與進階教程》、《Python數據結構與算法教程》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結》及《Python入門與進階經典教程》
希望本文所述對大家Python程序設計有所幫助。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。