Python3.5面向?qū)ο蟪绦蛟O(shè)計(jì)之類(lèi)的繼承和多態(tài)詳解
本文實(shí)例講述了Python3.5面向?qū)ο蟪绦蛟O(shè)計(jì)之類(lèi)的繼承和多態(tài)。分享給大家供大家參考,具體如下:
1、繼承的定義
繼承是指:可以使用現(xiàn)有類(lèi)的所有功能,并在無(wú)需重新編寫(xiě)原來(lái)的類(lèi)的情況下對(duì)這些功能進(jìn)行擴(kuò)展。
(1)通過(guò)繼承創(chuàng)建的新類(lèi)稱為“子類(lèi)”或“派生類(lèi)”。
(2)被繼承的類(lèi)稱為“基類(lèi)”、“父類(lèi)”或“超類(lèi)”。
繼承的過(guò)程,就是從一般到特殊的過(guò)程。要實(shí)現(xiàn)繼承,可以通過(guò)“繼承”(Inheritance)和“組合”(Composition)來(lái)實(shí)現(xiàn)。
在某些 OOP 語(yǔ)言中,一個(gè)子類(lèi)可以繼承多個(gè)基類(lèi)。但是一般情況下,一個(gè)子類(lèi)只能有一個(gè)基類(lèi),要實(shí)現(xiàn)多重繼承,可以通過(guò)多級(jí)繼承來(lái)實(shí)現(xiàn)。
2、繼承的分類(lèi)
繼承概念的實(shí)現(xiàn)方式主要有2類(lèi):實(shí)現(xiàn)繼承、接口繼承。
(1) 實(shí)現(xiàn)繼承是指使用基類(lèi)的屬性和方法而無(wú)需額外編碼的能力;
(2)接口繼承是指僅使用屬性和方法的名稱、但是子類(lèi)必須提供實(shí)現(xiàn)的能力(子類(lèi)重構(gòu)父類(lèi)方法);
在考慮使用繼承時(shí),有一點(diǎn)需要注意,那就是兩個(gè)類(lèi)之間的關(guān)系應(yīng)該是“屬于”關(guān)系。
抽象類(lèi)僅定義將由子類(lèi)創(chuàng)建的一般屬性和方法。
OO開(kāi)發(fā)范式大致為:劃分對(duì)象→抽象類(lèi)→將類(lèi)組織成為層次化結(jié)構(gòu)(繼承和合成) →用類(lèi)與實(shí)例進(jìn)行設(shè)計(jì)和實(shí)現(xiàn)幾個(gè)階段。
3、示例代碼
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu
#類(lèi)的繼承
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): #繼承父類(lèi)People類(lèi)
def make_money(self):
print("%s is making money..." %self.name)
def sleep(self):
People.sleep(self) #對(duì)父類(lèi)方法的擴(kuò)展
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()
運(yùn)行結(jié)果:
Jack is eating...
Jack is making money...
Jack is sleeping...
man is sleeping...
Amy is talking...
Amy is shopping...
4、子類(lèi)中對(duì)父類(lèi)的構(gòu)造函數(shù)進(jìn)行重構(gòu)兩種方法
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu
#類(lèi)的繼承
#class People: #經(jīng)典類(lèi)
class People(object): #新式類(lèi)
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): #繼承父類(lèi)People類(lèi)
def __init__(self,name,age,money):
#People.__init__(self,name,age) #(方法一)對(duì)構(gòu)造函數(shù)進(jìn)行重構(gòu)、添加父類(lèi)中沒(méi)有的屬性
super(Man,self).__init__(name,age) #(方法二)利用super對(duì)構(gòu)造函數(shù)進(jìn)行重構(gòu)(新式類(lèi)寫(xiě)法)
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) #對(duì)父類(lèi)方法的擴(kuò)展
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()
運(yùn)行結(jié)果:
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
#類(lèi)的繼承
#class People: #經(jīng)典類(lèi)
class People(object): #新式類(lèi)
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) #(方法一)對(duì)構(gòu)造函數(shù)進(jìn)行重構(gòu)、添加父類(lèi)中沒(méi)有的屬性
super(Man,self).__init__(name,age) #(方法二)利用super對(duì)構(gòu)造函數(shù)進(jìn)行重構(gòu)(新式類(lèi)寫(xiě)法)
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) #對(duì)父類(lèi)方法的擴(kuò)展
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)
運(yùn)行結(jié)果:
Jack have money 10$
Jack is making friends with Amy
[<__main__.Women object at 0x0057FA30>]
6、新式類(lèi)與經(jīng)典類(lèi)的繼承順序
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu
class A(object): #新式類(lèi)
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、繼承示例——學(xué)校、教師與學(xué)生
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:ZhengzhengLiu
#繼承實(shí)例(新式類(lèi))——模擬學(xué)校、教師與學(xué)生
class School(object):
def __init__(self,name,addr):
self.name = name
self.addr = addr
self.students = []
self.stuffs = []
def enroll(self,stu_obj): #學(xué)生注冊(cè)
print("%s 學(xué)員辦理注冊(cè)" %stu_obj.name)
self.students.append(stu_obj)
def heir(self,staff_obj): #聘請(qǐng)教師
print("聘請(qǐng)教師 %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))
#實(shí)例化
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")
#調(diào)用顯示學(xué)生與教師的信息
t1.tell()
s1.tell()
school.heir(t1) #聘請(qǐng)教師t1
school.enroll(s1) #學(xué)生s1注冊(cè)
school.enroll(s2)
print(school.stuffs)
print(school.students)
#聘請(qǐng)的第一位教師教課
school.stuffs[0].teach()
for stu in school.students:
stu.pay_tuition(5000)
運(yùn)行結(jié)果:
----- 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
聘請(qǐng)教師 Jack
liu 學(xué)員辦理注冊(cè)
wang 學(xué)員辦理注冊(cè)
[<__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、多態(tài)(polymorphisn)——一種接口,多種形態(tài)
(1)定義
多態(tài)性(polymorphisn)是允許你將父對(duì)象設(shè)置成為和一個(gè)或更多的他的子對(duì)象相等的技術(shù),
賦值之后,父對(duì)象就可以根據(jù)當(dāng)前賦值給它的子對(duì)象的特性以不同的方式運(yùn)作。
簡(jiǎn)單的說(shuō),就是一句話:允許將子類(lèi)類(lèi)型的指針賦值給父類(lèi)類(lèi)型的指針。
多態(tài)的作用:我們知道,封裝可以隱藏實(shí)現(xiàn)細(xì)節(jié),使得代碼模塊化;繼承可以擴(kuò)展已存在的代碼模塊(類(lèi));它們的目的都是為了——代碼重用。
而多態(tài)則是為了實(shí)現(xiàn)另一個(gè)目的——接口重用!多態(tài)的作用,就是為了類(lèi)在繼承和派生的時(shí)候,保證使用“家譜”中任一類(lèi)的實(shí)例的某一屬性時(shí)的正確調(diào)用。
Pyhon 很多語(yǔ)法都是支持多態(tài)的,比如 len(),sorted(), 你給len傳字符串就返回字符串的長(zhǎng)度,傳列表就返回列表長(zhǎng)度。
(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")
# 多態(tài)——一種接口,多種形態(tài)
@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()
#多態(tài)
Animal.animal_talk(d)
Animal.animal_talk(c)
運(yùn)行結(jié)果:
A Woof! Woof!
B Meow!
9、面向?qū)ο笤O(shè)計(jì)利器——領(lǐng)域建模
(1)定義
從領(lǐng)域模型開(kāi)始,我們就開(kāi)始了面向?qū)ο蟮姆治龊驮O(shè)計(jì)過(guò)程,可以說(shuō),領(lǐng)域模型是完成從需求分析到面向 對(duì)象設(shè)計(jì)的一座橋梁。
領(lǐng)域模型,顧名思義,就是需求所涉及的領(lǐng)域的一個(gè)建模,更通俗的講法是業(yè)務(wù)模型。
(2)領(lǐng)域模型有兩個(gè)主要的作用:
發(fā)掘重要的業(yè)務(wù)領(lǐng)域概念
建立業(yè)務(wù)領(lǐng)域概念之間的關(guān)系
(3)領(lǐng)域建模三字經(jīng)
領(lǐng)域模型如此重要,領(lǐng)域建模的方法概括一下就是“找名詞”! 即使是簡(jiǎn)單的找名詞這樣的操作,也涉及到分析和提煉,而 不是簡(jiǎn)單的摘取出來(lái)就可,
這種情況下分析師和設(shè)計(jì)師的經(jīng)驗(yàn)和技能就能夠派上用場(chǎng)了。但領(lǐng)域模型分析 也確實(shí)相對(duì)簡(jiǎn)單,即使沒(méi)有豐富的經(jīng)驗(yàn)和高超的技巧,至少也能完成一個(gè)能用的領(lǐng)域模型。
一個(gè)關(guān)鍵的問(wèn)題:從哪里找? 因?yàn)轭I(lǐng)域模型是“需求到面向?qū)ο蟮臉蛄骸保芟氲剑簭男枨竽P椭姓?,具體來(lái)說(shuō)就是從用例中找。
歸納:領(lǐng)域建模的方法就是“從用例中找名詞”。 當(dāng)然,找到名詞后,為了能夠更加符合面向?qū)ο蟮囊蠛吞攸c(diǎn)。
我們還需要對(duì)這些名詞進(jìn)一步完善,這就 是接下來(lái)的步驟:加屬性,連關(guān)系!
最后我們總結(jié)出領(lǐng)域建模的三字經(jīng)方法:找名詞、加屬性、連關(guān)系。



更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)與進(jìn)階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門(mén)與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
- Python面向?qū)ο蟪绦蛟O(shè)計(jì)之私有變量,私有方法原理與用法分析
- Python面向?qū)ο蟪绦蛟O(shè)計(jì)之繼承、多態(tài)原理與用法詳解
- Python面向?qū)ο蟪绦蛟O(shè)計(jì)之靜態(tài)方法、類(lèi)方法、屬性方法原理與用法分析
- Python面向?qū)ο蟪绦蛟O(shè)計(jì)之類(lèi)和對(duì)象、實(shí)例變量、類(lèi)變量用法分析
- Python面向?qū)ο蟪绦蛟O(shè)計(jì)類(lèi)的多態(tài)用法詳解
- Python面向?qū)ο蟪绦蛟O(shè)計(jì)類(lèi)的封裝與繼承用法示例
- Python面向?qū)ο蟪绦蛟O(shè)計(jì)類(lèi)變量與成員變量、類(lèi)方法與成員方法用法分析
- Python面向?qū)ο蟪绦蛟O(shè)計(jì)構(gòu)造函數(shù)和析構(gòu)函數(shù)用法分析
- Python面向?qū)ο蟮某绦蛟O(shè)計(jì)詳情
相關(guān)文章
Python編程中time模塊的一些關(guān)鍵用法解析
這篇文章主要介紹了Python編程中time模塊的一些關(guān)鍵用法解析,像mktime和localtime以及gmtime這些常用方法都有講到,需要的朋友可以參考下2016-01-01
Python自動(dòng)化辦公之Word文檔的創(chuàng)建與生成
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)python腳本來(lái)自動(dòng)生成一個(gè)?word文檔,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-05-05
Pytorch 實(shí)現(xiàn)計(jì)算分類(lèi)器準(zhǔn)確率(總分類(lèi)及子分類(lèi))
今天小編就為大家分享一篇Pytorch 實(shí)現(xiàn)計(jì)算分類(lèi)器準(zhǔn)確率(總分類(lèi)及子分類(lèi)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
python實(shí)現(xiàn)音樂(lè)播放器 python實(shí)現(xiàn)花框音樂(lè)盒子
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)音樂(lè)播放器,實(shí)現(xiàn)花框音樂(lè)盒子,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02
談?wù)剬?duì)Pytorch中的forward的理解
這篇文章主要介紹了談?wù)剬?duì)Pytorch中的forward的理解,在Pytorch中,forward方法是一個(gè)特殊的方法,被專門(mén)用來(lái)進(jìn)行前向傳播,本文給大家詳細(xì)講解,需要的朋友可以參考下2023-04-04
Python實(shí)現(xiàn)圖數(shù)據(jù)處理的完整指南
圖是一種非常重要的數(shù)據(jù)結(jié)構(gòu),在Python中,我們可以使用鄰接矩陣來(lái)表示圖,這篇文章主要為大家介紹了Python實(shí)現(xiàn)圖數(shù)據(jù)處理的相關(guān)知識(shí),需要的可以參考下2024-04-04
Python-Tkinter Text輸入內(nèi)容在界面顯示的實(shí)例
今天小編就為大家分享一篇Python-Tkinter Text輸入內(nèi)容在界面顯示的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07

