組合,菱形繼承問題,多型性,繼承的呼叫

2021-08-21 01:23:59 字數 3809 閱讀 6667

一:組合

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 繼承與多型性

編寫乙個人員資訊管理系統。這個系統的功能是 互動式的實現校園人員資訊的錄入與顯示。分析 學校裡,主要有四類人員 大學本科學生 教師 研究生和助教。大學本科生每週有固定的學時數。教師除了固定的學時數外,還有每週的教學時數。研究生除了固定的學時數外,每週還可以自由做一定的研究。助教生除了上課外,還要做研...