一:組合
1,什麼是組合?
組合就是乙個類的物件具備某乙個屬性,該屬性的值是指向另外乙個類的物件
2,為何用組合?
組合也是用來解決類與類之間**冗餘問題的
3,使用組合
class course:#定義課程了類
def __init__(self,name,period,price):
self.name=name
self.period=period
self.price=price
def tell_info(self):#定義檢視課程資訊的乙個方法
msg="""
課程名:%s
課程週期:%s
課程價錢:%s
""" %(self.name,self.period,self.price)
print(msg)
class oldboypeople:#定義人類
school = 'oldboy'
def __init__(self, name, age, ***):
self.name = name
self.age = age
self.*** = ***
class oldboystudent(oldboypeople):#定義學生類
def __init__(self,name,age,***,stu_id):
oldboypeople.__init__(self,name,age,***)
self.stu_id=stu_id
def choose_course(self):
print('%s is choosing course' %self.name)
class oldboyteacher(oldboypeople):#定義老師類
def __init__(self, name, age, ***, level):
oldboypeople.__init__(self,name,age,***)
self.level=level
def score(self,stu,num):
stu.score=num
print('老師[%s]為學生[%s]打分[%s]' %(self.name,stu.name,num))
# 創造課程
python=course('python全棧開發','5mons',3000)
linux=course('linux運維','5mons',800)
# python.tell_info()
# linux.tell_info()
# 創造學生與老師
stu1=oldboystudent('豬哥',19,'male',1)
tea1=oldboyteacher('egon',18,'male',10)
# 將學生、老師與課程物件關聯/組合 重點
stu1.course=python
tea1.course=linux
stu1.course.tell_info()
tea1.course.tell_info()
二:菱形繼承問題
1,什麼是菱形繼承?
當乙個子類繼承多個父類時,多個父類最終繼承了同乙個類,稱之為稜形繼承
2,菱形繼承問題
python2區分經典類與新式類,如果子類的繼承是乙個菱形繼承,那麼
經典類下查詢屬性:深度優先查詢
新式類下查詢屬性:廣度優先查詢#新式類下提供了乙個mro()方法用於查詢mro鏈條
三:在子類派生新方法中重用父類功能的兩種方式
在子派生的新方法中重用父類功能的兩種方式
方式一:指名道姓法:直接用:類名,函式名
class oldboystudent(oldboypeople):
# def __init__(self,name,age,***,stu_id):
# oldboypeople.__init__(self,name,age,***)#方式一
# self.stu_id=stu_id
方式二:嚴格按照繼承屬性查詢關係
super()會得到乙個特殊的物件,該物件就是專門用來訪問父類中的屬性的(按照繼承的關係)
supe().__init__(不用為self傳值)
注意點:
super的完整用法是super(自己的類名,self),在python2中需要寫完整,而python3中可以簡寫為super()
列如:class oldboystudent(oldboypeople):
# def __init__(self,name,age,***,stu_id):
# # oldboypeople.__init__(self,name,age,***)
# super(oldboystudent,self).__init__(name,age,***)#完整的super呼叫
# self.stu_id=stu_id
四:多型與多型性
1,什麼是多型
多型指的是同一種事物的多種狀態
水-——》冰,水蒸氣,液態水
動物—————》人,狗,豬
2,為什麼要用多型
多型性: 繼承同乙個類的多個子類中有相同的方法名
那麼子類產生的物件就可以不用考慮具體的型別而直接呼叫功能
3,用法
import abc
class animal(metaclass=abc.abcmeta):
@abc.abstractmethod
def speak(self):
pass
@abc.abstractmethod
def eat(self):
pass
# animal() #強調:父類是用來指定標準的,不能被例項化
class people(animal):
def speak(self):
print('say hello')
def eat(self):
pass
class dog(animal):
def speak(self):
print('汪汪汪')
def eat(self):
pass
class pig(animal):
def speak(self):
print('哼哼哼')
def eat(self):
pass
peo1=people()
dog1=dog()
pig1=pig()
# python推崇的是鴨子型別,只要你叫的聲音像鴨子,並且你走路的樣子也像鴨子,那你就是鴨子
class disk:
def read(self):
print('disk read')
def write(self):
print('disk wirte')
class process:
def read(self):
print('process read')
def write(self):
print('process wirte')
class file:
def read(self):
print('file read')
def write(self):
print('file wirte')
obj1=disk()
obj2=process()
obj3=file()
繼承和組合 多型性和虛函式
繼承和組合 重用已存在類的 有兩種方式 1,組合,即在新類中建立已存在類的物件 2,繼承,即建立乙個新類作為乙個已存在類的型別。在派生類中可以重新定義基類中的成員函式,派生類的物件呼叫該函式時呼叫的是重新定義的成員函式,而呼叫基類的成員函式只能使用作用域顯示的標明基類名。建構函式和析構函式的呼叫順序...
多型性和虛繼承
多型性 字面意思是多種形狀,即 乙個介面,多種方法 c 的多型性是由虛函式來實現的,虛函式允許派生類重新定義成員函式,派生類重新定義基類的方法稱為遮蔽。只有重寫虛函式才算是體現了函式的多型性。過載沒有體現多型性,因為過載是根據同名函式的不同引數型別選擇使用哪個函式的。include using na...
C 繼承與多型性
編寫乙個人員資訊管理系統。這個系統的功能是 互動式的實現校園人員資訊的錄入與顯示。分析 學校裡,主要有四類人員 大學本科學生 教師 研究生和助教。大學本科生每週有固定的學時數。教師除了固定的學時數外,還有每週的教學時數。研究生除了固定的學時數外,每週還可以自由做一定的研究。助教生除了上課外,還要做研...