資源簡介 (共26張PPT)Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.少兒編程課面向對象編程進階這一節,我們學習面向對象的三大特征:封裝、繼承和多態三大特征之封裝什么是封裝呢?我們用前面Orc類來說:class Orc:def __init__(self, name, hp, lv):self.name = nameself.hp = hpself.lv = lvdef desc(self):print('我是%s,血量為:%s,等級為:%s' %(self.name, self.hp, self.lv))orc = Orc('史瑞克', 200, 2)orc.desc()在面向對象的編程思想中,將屬性和方法隱藏在類中的行為,就稱為封裝。屬性和方法通過對象調用,對于調用者來說,隱藏了具體的實現細節。封裝除了隱藏細節外,還有另一個目的:數據的安全就像機箱的目的是為了保護電腦內部的主板、硬盤、處理器、電源等那么對于當前的Orc類來說,如何保證內部屬性數據的安全呢?class Orc:def __init__(self, name, hp, lv):self.name = nameself.hp = hpself.lv = lvdef desc(self):print('我是%s,血量為:%s,等級為:%s' % (self.name, self.hp, self.lv))orc = Orc('史瑞克', 200, 2)# 語法上沒問題,但是不符合實際情況!orc.hp = -200orc.desc()這就好比,如何能保證電腦內部硬盤的安全,同時又能夠讓外部能夠訪問到硬盤對于電腦來說是機箱+USB接口,對于類來說,是私有+getter/setter1屬性前加上__,就變成了了私有屬性class Orc:def __init__(self, name, hp, lv):self.__name = nameself.__hp = hpself.__lv = lvdef desc(self):print('我是%s,血量為:%s,等級為:%s' %(self.__name, self.__hp, self.__lv))orc = Orc('史瑞克', 200, 2)orc.desc()# 此時打印,會報錯print(orc.__hp)Traceback (most recent call last):File "C:/…/demo01.py", line 13, in print(orc.__hp)AttributeError: 'Orc' object has no attribute '__hp'此時運行(類外部訪問),就會報錯2外部如何訪問屬性呢?比如獲取當前的血量class Orc:def __init__(self, name, hp, lv):self.__name = nameself.__hp = hpself.__lv = lvdef desc(self):print(‘我是%s,血量為:%s,等級為:%s’ %(self.__name, self.__hp, self.__lv))# get方法def get_hp(self):return self.__hporc = Orc('史瑞克', 200, 2)orc.desc()# get方法的使用print(orc.get_hp())這就是所謂的屬性的getter方法那又該如何在外部修改屬性的值呢?比如血量減少之后hp的重新賦值3這就是和getter對應的setter方法,類定義如下:外部訪問過程如下:class Orc:def __init__(self, name, hp, lv):self.__name = nameself.__hp = hpself.__lv = lvdef desc(self):print('我是%s,血量為:%s,等級為:%s' %(self.__name, self.__hp, self.__lv))def get_hp(self):return self.__hpdef set_hp(self, hp):self.__hp = hporc = Orc('史瑞克', 200, 2)orc.desc()# 模擬orc這個對象減少了50點血orc.set_hp(150)orc.desc()print(orc.get_hp())我是史瑞克,血量為:200,等級為:2我是史瑞克,血量為:150,等級為:2150輸出結果為:思考:使用私有+getter/setter為什么解決數據安全的問題?為什么說私有+getter/setter就解決了數據的安全(臟數據)問題呢?關鍵在setter方法上,在該方法中,我們可以做任何的處理,比如對hp小于0的賦值都置為0:class Orc:……def set_hp(self, hp):if hp < 0:self.__hp = 0else:self.__hp = hporc = Orc('史瑞克', 200, 2)orc.desc()# 模擬orc這個對象減少了50點血orc.set_hp(-150)orc.desc()print(orc.get_hp())我是史瑞克,血量為:200,等級為:2我是史瑞克,血量為:0,等級為:20運行結果為:三大特征之繼承現在假設我們做一個學校管理系統,那么就可能會要新建兩個類1教師類,屬性有:姓名、年齡、職位等2學生類,屬性有:姓名、年齡、專業等class Teacher:def __init__(self, name, age, position):self.__name = nameself.__age = ageself.__position = positiondef desc(self):print('大家好,我是一名教師,''我叫%s,今年%s歲,目前職位為:%s' %(self.__name, self.__age, self.__position))def get_name(self):return self.__namedef get_age(self):return self.__agedef get_position(self):return self.__positiondef set_name(self, name):self.__name = namedef set_age(self, age):self.__age = agedef set_position(self, position):self.__position = positionclass Student:def __init__(self, name, age, major):self.__name = nameself.__age = ageself.__major = majordef desc(self):print('大家好,我是一名學生,''我叫%s,今年%s歲,在讀專業為:%s' %(self.__name, self.__age, self.__major))def get_name(self):return self.__namedef get_age(self):return self.__agedef get_major(self):return self.__majordef set_name(self, name):self.__name = namedef set_age(self, age):self.__age = agedef set_major(self, major):self.__major = major可以發現這兩個類中有很多重復的地方,比如name和age屬性及其get/set方法agenameposition教師類agenamemajor學生類agenamepositionmajor教師類學生類把共同部分提取出來這樣有什么好處呢?代碼進行了復用!agenamepositionmajoragenameposition教師類agenamemajor學生類agenamedept后勤人員類dept父類子類實際子類下面我們來看下Python中繼承的寫法,還以教師類和學生類來說:1定義父類,包含name和age屬性2定義Teacher類,繼承Person類class Person:def __init__(self, name, age):self.__name = nameself.__age = agedef desc(self):print('我是父類,姓名:%s,年齡:%s' % (self.__name, self.__age))class Teacher(Person):def __init__(self, name, age, position):# super():用于調用父類的方法super().__init__(name, age)self.__position = positionteacher = Teacher('張三', 20, 'aaa')teacher.desc()這樣,屬性和方法都繼承了過來練習Exercises密封線內不準答題編寫Student類,繼承自Person類三大特征之多態現在,我們用上一步的Person、Teacher和Student來看下什么是多態2使用teacher對象調用desc(),1在Person中提供name和age的getter/setterclass Teacher(Person):def __init__(self, name, age, position):# super():用于調用父類的方法super().__init__(name, age)self.__position = positionteacher = Teacher('張三', 20, 'aaa')teacher.desc()這樣輸出的是父類的desc()3在Teacher類中添加desc方法,類似如下:def desc(self):print('我是一名教師,名字:''%s,年齡:%s,職位:%s'% (super().get_name(), super().get_age(), self.__position))練習Exercises密封線內不準答題添加Student類中的desc()方法,注意super()的使用!現在,讓我們再次來運行teacher或student對象的desc()方法,以teacher為例:代碼為:teacher = Teacher('張三', 20, '教研組長')teacher.desc()運行結果為:我是一名教師,名字:張三,年齡:20,職位:教研組長也即是說,子類的desc方法覆蓋了父類的desc方法,當調用的時候,調用的是子類的方法,這就叫多態這個該如何去理解呢?舉個例子,下面的圖片,都是鳥用面向對象的思想來看,是這樣的:父類:鳥類子類:麻雀類子類:鸚鵡類子類:老鷹類長羽毛()長…羽毛()長…羽毛()長…羽毛()生態學角度來看,這就是生物的多樣性那么多態有什么好處呢?比如你想查看所有鳥類羽毛的顏色不管有多少種鳥(子)類,只需要定義一個方法就能查看所有鳥的顏色了。因為此時調用羽毛顏色()方法,實際調用的是子類重寫后的羽毛顏色()方法。同時符合面向對象6大設計原則中的對擴展開放、對修改關閉原則。不使用多態的情況下:def 查看羽毛顏色(麻雀):print(‘羽毛顏色為:%s’ % 麻雀.羽毛顏色())def 查看羽毛顏色(鸚鵡):print('羽毛顏色為:%s' % 鸚鵡.羽毛顏色())def 查看羽毛顏色(老鷹):print('羽毛顏色為:%s' % 老鷹.羽毛顏色())使用多態的情況下:def 查看羽毛顏色(鳥):print('羽毛顏色為:%s' % 鳥.羽毛顏色())最后,我們用一句話來總結面向對象的編程實現由現實中的對象,抽象得到程序中的類,使用類來創建程序中的對象,使用對象的方法來編寫具體的業務。因為數據的安全性和方便性,有了封裝,為了代碼的復用,有了繼承,繼承就有父子類,子類會重寫父類的方法,有了重寫,就有了多態,多態是為了統一處理某一類信息方便,同時方便了軟件的擴展(對擴展開放)。總結Summary面向對象三大特征:封裝、繼承、多態√super關鍵字的理解和使用√Thanks! 展開更多...... 收起↑ 資源預覽 縮略圖、資源來源于二一教育資源庫