Day 23 面向对象进阶
生活随笔
收集整理的這篇文章主要介紹了
Day 23 面向对象进阶
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 面向對象進階
- 類的繼承
- 什么是繼承
- 為什么要用繼承
- 對象的繼承
- 對象查找屬性的順序
- 類的派生
- 類的組合
- 菱形繼承問題
- 類的分類
- 菱形繼承問題
- 多態與多態性
- 多態
- 多態性
- 類的繼承
面向對象進階
類的繼承
什么是繼承
- 繼承是一種新建類的方式,新建的類稱為子類,被繼承的類稱為父類
- python當中,父類,子類(派生類),父類和子類只有在繼承的時候才會產生
- 繼承是為了獲取父類的屬性
為什么要用繼承
- 集成可以減少代碼冗余
對象的繼承
- python中支持一個子類繼承多個父類,但是不推薦使用繼承多個父類,當你繼承多個的時候,功能與功能之間就會混亂,所以建議繼承一個
- python3中如果一個類沒有繼承任何類,那么默認繼承object類
- python2中如果一個類沒有繼承任何類,不會繼承object類
對象查找屬性的順序
先對象自己,后然后對象的類,然后父類,在父類,知道object類
類的派生
派生就是子類定義新的屬性,同時還繼承父類的所有屬性
方法一:指名道姓的訪問某一個類的函數,該方式與繼承無關
class Animal():def __init__(self, height, weight): self.height = height self.weight = weight def jiao(self):print(self.__class__.__name__, '叫')class People(Animal):def __init__(self, name, age,height,weight):Animal.__init__(self,height,weight)self.name = nameself.age = agedef read(self):print('read')p1=People('nick',18,180.140) print(p1.__dict__)方法二:派生
- 嚴格以繼承屬性查找關系
- super()會得到一個特殊的對象,該對象就是專門用來訪問父類中的屬性的(按照繼承的關系)
- super的完整用法是super(自己的類名,self),在python2中需要完整寫明,二python3中可以簡寫為super()
類的組合
組合就是一個類的對象具備某一個屬性,該屬性的值是指向另外一個類的對象
組合就是用來解決類與類之間代碼冗余的問題
class People:def __init__(self,name,sex):self.name=nameself.sex=sexdef eat(self):print(f'{self.name}開始吃')class Student(People):def __init__(self,id,name,sex):super(Student, self).__init__(name,sex)self.id=iddef choose_course(self,course):self.course=course #相當于student派生一個course屬性,該屬性引用外部傳入的course也就是Course生成的對象print(f'{self.name}選擇了課程{course.name}')class Teacher(People):def __init__(self,level,name,sex):super(Teacher, self).__init__(name,sex)self.level=leveldef scored(self,student,course,score):print(f'{self.name}給學生{student.name}的課程{course.name}打{score}分')class Admin(People):def create_course(self,name,price):course=Course(name,price)print(f'管理員{self.name}創建了課程{name}')return courseclass Course:def __init__(self,name,price):self.name=nameself.price=pricest1=Student('01','zhujian','male') st2=Student('02','tom','male') print(st1.__dict__) print(st2.__dict__)t1=Teacher('1','nick','male') print(t1.__dict__)a1=Admin('egon','male') print(a1.__dict__)linux=a1.create_course('linux',6666) python=a1.create_course('python',8888)st1.choose_course(python) st2.choose_course(linux)t1.scored(st1,python,'96') t1.scored(st2,linux,'95')菱形繼承問題
類的分類
- 繼承了object的類以及該類的子類,都是新式類
- python3中所有的類都是新式類
- 沒有繼承object的類以及該類的子類,都是經典類
- 只有python2中才有經典類
菱形繼承問題
如果繼承關系為菱形結構,即子類的父類最后繼承了同一個類,那么屬性的查找有兩種:
- 經典類:深度優先:一條路走到底.先從子類的第一個父類開始查找,直到這個子類繼承的最后一個父類,如果沒有找到就從子類的第二個父類開始查找(但不會找到最后一個父類),然后是子類的第三個父類,第四個父類,直到找到需要的屬性
- 新式類:廣度優先:不直接找最后一個繼承的父類,先從子類的子一個父類開始找,跳過繼承的最后一個父類,然后子類的第二個父類,第三個,直到最后一個父類然后再去查找他們繼承的最后一個父類
普通繼承就是按照正常循序查找
多態與多態性
多態
多態指的是一類事物有多種形態(一個抽象類有多個子類,因而多態的概念依賴于繼承)
多態性
多態性是指具有不同功能的函數可以使用相同的函數名,這樣就可以用給一個函數名調用不同內容的函數
轉載于:https://www.cnblogs.com/masterjian924/p/11056499.html
總結
以上是生活随笔為你收集整理的Day 23 面向对象进阶的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于Coravel定时任务之计算总页数
- 下一篇: 最终一致性。