日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python基础day09【面向对象(封装、继承、多态)、重写、私有权限】

發布時間:2024/9/30 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python基础day09【面向对象(封装、继承、多态)、重写、私有权限】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 視頻、源碼、課件、軟件、筆記:超全面Python基礎入門教程【十天課程】博客筆記匯總表【黑馬程序員】
  • Python基礎day09【面向對象(封裝、繼承、多態)、重寫、私有權限】

  • Python基礎day09【試題講解《python基礎中期考試》】

  • Python基礎day09 作業解析【面向對象題目(簡答題+代碼題)】

?

目錄

00、復習和反饋

01、繼承的基本語法[掌握]

02、單繼承和多層繼承[理解]

03、子類重寫父類的同名方法[掌握]

04、子類調用父類的同名方法[掌握]

05、繼承中的init[掌握]

06、多繼承[理解]

6.1、多繼承簡單案例

6.2、多繼承調用指定父類中的方法

07、私有權限[理解]

7.1、私有屬性

7.2、私有方法

08、類屬性[理解]

09、類方法

10、靜態方法[掌握]

11、多態[理解]

12、鴨子類型中的多態

13、總結

14、試題講解《python基礎中期考試》


?

00、復習和反饋

課程考試:基礎概念題+基礎編程題

01、繼承的基本語法[掌握]

程序中的繼承

  • 在程序中,繼承描述的是多個類之間的所屬關系;
  • 如果一個類A里面的屬性和方法可以復用(重復使用),則可以通過繼承的方式,傳遞到類B里;
  • 那么類A就是基類,也叫做父類;類B就是派生類,也叫做子類。
  • 繼承:描述的類與類之間所屬關系。
    基本語法:
    ? ? class 類B(類A):
    ? ? ? ?pass

    稱為類B繼承類A
    特點:B類的對象可以使用A類的屬性和方法。
    優點:代碼復用,重復相同的代碼不用多次書寫。

    名詞:
    ????類A:父類、基類
    ????類B:子類、派生類

    # 1.定義一個動物類:animal類 class Animal(object):# 2.在animal類書寫play方法,輸出快樂地玩耍...def play(self):print('快樂地玩耍...')# 3.定義Dog類繼承animal類 class Dog(Animal):pass# 4.創建dog類對象,調用父類的方法 dog = Dog() dog.play() # 快樂地玩耍...

    02、單繼承和多層繼承[理解]

    """ 單繼承:如果一個類只有一個父類, 把這種繼承關系稱為單繼承; 多繼承:如果一個類有多個父類, 把這種繼承關系稱為多繼承. 多層繼承:C-->B-->A """# 1. 定義一個動物類:animal類 class Animal(object): # 對于Animal類和object類來說,單繼承# 2. 在animal類書寫play方法,輸出‘快樂地玩耍...’def play(self):print('快樂地玩耍...')# 3. 定義Dog類繼承animal類 class Dog(Animal): # Dog-->Animal是單繼承, Dog -->Animal-->object這種繼承關系稱為多層繼承def bark(self):print('汪汪汪叫...')# 定義類:XTQ類(哮天犬), 繼承Dog類 # 多層繼承中,子類可以使用所有繼承鏈中的類中的方法和屬性 class XTQ(Dog): # XTQ-->Dog:單繼承;XTQ-->Dog-->Animal類:多層繼承passxtq = XTQ() xtq.bark() # 調用父類Dog中的方法 汪汪汪叫... xtq.play() # 調用爺爺類animal類中的方法 快樂地玩耍...

    03、子類重寫父類的同名方法[掌握]

    重寫:子類定義和父類名字相同的方法。
    為什么重寫:父類中的方法,不能滿足子類對象的需求,所以要重寫。
    重寫之后的特點:子類對象調用子類自己的方法,不再調用的方法,父類對象調用父類自己的方法。

    # 1. 定義Dog類, 書寫bark方法, 輸出‘汪汪叫...’ class Dog(object):def bark(self):print('汪汪叫...')# 2. 定義XTQ類繼承Dog類,重寫父類中的bark方法, 輸出‘嗷嗷叫~~~’ class XTQ(Dog): # 哮天犬def bark(self):print('嗷嗷叫~~~')dog = Dog() # 創建Dog類對象 dog.bark() # 父類自己的,汪汪叫...xtq = XTQ() # 創建XTQ類對象 xtq.bark() # 嗷嗷叫~~~

    04、子類調用父類的同名方法[掌握]

    ?

    # 1. 定義Dog類, 書寫bark方法, 輸出 汪汪汪叫 class Dog(object):def bark(self):print('汪汪叫...')# 2. 定義XTQ類,繼承Dog類. 重寫父類中的bark方法, 輸出 嗷嗷嗷叫 class XTQ(Dog):def bark(self):print('嗷嗷叫~~~')def see_host(self):"""看見主人之后,要汪汪汪叫,不能嗷嗷叫"""print('看見主人了,', end='')self.bark() # 嗷嗷叫~~~# 想要在子類中調用父類的同名方法# 方法一: 父類名.方法名(self, 其他參數), 通過‘實例對象.方法名()’調用方法,不需要給self傳遞實參值,# python解釋器會自動將對象作為實參值傳遞給self形參,如果是通過類名.方法()調用,# python解釋器就不會自動傳遞實參值,需要手動給self形參傳遞實參值Dog.bark(self) # 汪汪叫... 非常不推薦的方法:父類名(實參).方法名(),創建父類對象# 方法二:super(類A, self).方法名(參數), 會調用當類A的父類中的方法super(XTQ, self).bark() # 汪汪叫...,調用XTQ類父類中的bark方法# 方法三:是方法二的簡寫, super().方法名(參數) ==> super(當前類, self).方法名()super().bark() # 汪汪叫...# 創建XTQ類對象 xtq = XTQ() xtq.see_host()

    05、繼承中的init[掌握]

    如果子類重寫了父類的init方法,在子類中需要調用父類的init方法,給對象添加從父類繼承的屬性。
    注意:子類init方法的形參,一般都先寫父類的形參,再寫子類自己獨有的形參。

    說明:雖然子類沒有定義__init__方法初始化屬性,也沒有定義實例方法,但是父類有。所以只要創建子類的對象,就默認執行了那個繼承過來的__init__方法。

    總結:1.子類在繼承的時候,在定義類時,小括號()中為父類的名字;2.父類的屬性、方法,會被繼承給子類。

    # 1.定義Dog類 class Dog(object):def __init__(self, name):# 添加屬性self.age = 0self.name = namedef __str__(self):return f'名字:{self.name}, 年齡:{self.age}。'# 2.定義XTQ類繼承Dog類 class XTQ(Dog):# 子類重寫了父類的__init__()方法,默認不再調用父類的__init__()方法, 需要手動地調用父類的__init__()方法# 注意:子類init方法的形參,一般都先寫父類的形參,再寫子類自己獨有的形參。def __init__(self, name, color):super().__init__(name)self.color = colordef __str__(self):return f'名字:{self.name};年齡:{self.age};毛色:{self.color}。'# 3.創建XTQ類對象 xtq = XTQ('小黑', '紅色') print(xtq) # 名字:小黑;年齡:0;毛色:紅色。

    06、多繼承[理解]

    如果一個類有兩個及以上的父類,就把這種繼承關系稱為多繼承

    說明:

  • 多繼承可以繼承多個父類,也繼承了所有父類的屬性和方法;
  • 注意:如果多個父類中有同名的屬性和方法,則默認使用第一個父類的屬性和方法(根據類的魔法屬性mro的順序來查找);
  • 多個父類中,不重名的屬性和方法,不會有任何影響。
  • 6.1、多繼承簡單案例

    # 1.定義Dog類,定義bark方法和eat方法 class Dog(object):def bark(self):print('汪汪叫...')def eat(self):print('啃骨頭...')# 2.定義God類,定義play方法和eat方法 class God(object):def play(self):print('在云中飄一會...')def eat(self):print('吃蟠桃仙丹...')# 3.定義XTQ類,繼承Dog類和God類 # class XTQ(Dog, God): # XTQ類有兩個父類,這種繼承關系稱為多繼承,XTQ類對象可以調用兩個父類中的屬性和方法 class XTQ(God, Dog):pass# 4.創建XTQ類對象 xtq = XTQ() xtq.bark() # 調用Dog父類中的方法,汪汪叫... xtq.play() # 調用God父類中的方法,在云中飄一會...xtq.eat() # 兩個父類都存在eat方法,子類對象調用的是第一個父類中的方法,吃蟠桃仙丹...

    6.2、多繼承調用指定父類中的方法

    # 1.定義Dog類,定義bark方法和eat方法 class Dog(object):def bark(self):print('汪汪叫...')def eat(self):print('啃骨頭...')# 2.定義God類,定義play方法和eat方法 class God(object):def play(self):print('在云中飄一會...')def eat(self):print('吃蟠桃仙丹...')# 3.定義XTQ類,繼承Dog類和God類 # class XTQ(Dog, God): # XTQ類有兩個父類,這個繼承關系稱為多繼承,XTQ類對象可以調用兩個父類中的屬性和方法 class XTQ(God, Dog): # XTQ類有兩個父類,這個繼承關系稱為多繼承,XTQ類對象可以調用兩個父類中的屬性和方法def eat(self):print('子類重寫eat方法,調用子類自己的方法。')# 調用指定父類中的方法# 方法一:類名.方法名(self, 參數)Dog.eat(self) # 啃骨頭...God.eat(self) # 吃蟠桃仙丹...# 方法二:super(類A, self).方法名(參數):調用類A的父類(繼承順序鏈的下一個類)中的方法super(XTQ, self).eat() # 調用God類中的方法,吃蟠桃仙丹...super(God, self).eat() # 調用Dog類中的方法,啃骨頭...# super(Dog, self).eat() # 調用object類中的方法,注意: 但object類中沒有eat方法,所以代碼報錯print('子類重寫eat方法,調用子類自己的方法。')# 4.創建XTQ類對象 xtq = XTQ() xtq.bark() # 調用Dog父類中的方法,汪汪叫... xtq.play() # 調用God父類中的方法,在云中飄一會...xtq.eat() # 兩個父類都存在eat方法,子類對象調用的是第一個父類中的方法# 類名.__mro__:可以查看當前類的繼承順序鏈,也叫做方法的調用順序。不需要自己定義內容,自動定義內容。 print(XTQ.__mro__) # (<class '__main__.XTQ'>, <class '__main__.God'>, <class '__main__.Dog'>, <class 'object'>)

    07、私有權限[理解]

    面向對象三大特性:封裝、繼承、多態。

    封裝的意義:

  • 將屬性和方法放到一起做為一個整體,然后通過實例化對象來處理;
  • 隱藏內部實現細節,只需要和對象及其屬性和方法交互就可以了;
  • 對類的屬性和方法增加 訪問權限控制。
  • 私有權限:在屬性名方法名前面,加上兩個下劃線__。

  • 類的私有屬性 和 私有方法,都不能通過對象直接訪問,但是可以在本類內部訪問;
  • 類的私有屬性 和 私有方法,都不會被子類繼承,子類也無法訪問;
  • 私有屬性 和 私有方法 往往用來處理類的內部事情,不通過對象處理,起到安全作用。
  • 總結

  • Python中沒有像C++中 public 和 private 這些關鍵字來區別公有屬性和私有屬性。
  • Python是以屬性命名方式來區分,如果在屬性和方法名前面加了2個下劃線'__',則表明該屬性和方法是私有權限,否則為公有權限。

  • 訪問權限控制:在什么地方可以使用和操作。
    私有權限:
    ?? ?定義:在方法和屬性前加上兩個下劃線,就變為私有;
    ?? ?1.不能在類外部通過對象直接訪問和使用,只能在類內部訪問和使用;
    ?? ?2.不能被子類繼承。
    公有:不是私有的就是公有的。

    7.1、私有屬性

    """ 私有屬性:只需要在原屬性名前加上兩個下劃線即可。 目的:保證數據的相對安全。 想要訪問和使用私有屬性:定義一個公有的方法,通過這個方法使用。 """ # 案例需求: 定義People類,定義屬性ICBC_money,錢不能隨便被修改,必須是合法的終端才可以操作 class People(object):def __init__(self):# python中的私有本質是修改屬性的名字,在創建對象的時候,會自動地修改屬性名# 在屬性名的前邊加上‘_類名前綴’self.__ICBC_money = 0 # 定義私有屬性# 定義公有的方法,提供接口,修改余額def get_money(self):return self.__ICBC_moneydef set_money(self, money):num = input('輸入金額:')self.__ICBC_money += int(num)# self.__ICBC_money += money# 創建People類對象 xw = People() # 小王 # print(xw.__ICBC_money) # 實例對象.__dict__:可以查看對象具有的屬性信息,類型是字典,字典的key是屬性名,字典的value是屬性值 print('賦值之前:', xw.__dict__) xw.__ICBC_money = 1000; # 不是修改私有屬性,是重新添加一個公有屬性 print('賦值之后:', xw.__dict__) print(xw.__ICBC_money)print('------------------------------------------------------')print(xw.get_money()) # 0 xw.set_money(1000) print(xw.get_money()) # 1000 xw.set_money(-500) print(xw.get_money()) # 500

    7.2、私有方法

    """ 私有方法:在方法的前邊加上兩個__ ,就為私有方法。 私有方法:不能在類外部訪問。 作用:一般作為類內部的方法使用,不讓在外部直接調用,保證業務邏輯不被破壞。 """ class Dog(object):def born(self):"""生小狗的方法,生一個小狗,休息30天"""print('生了一只小狗...')self.__sleep()def __sleep(self):print('休息30天~')dog = Dog() # dog.__sleep() # 報錯 dog.born()# 生了一只小狗... # 休息30天~

    08、類屬性[理解]

    對象(實例對象):通過class定義的類創建的,即通過類實例化來的,又稱為實例、實例對象
    實例對象定義的屬性稱為實例屬性,通過實例對象(self)定義的屬性都是實例屬性。
    實例屬性:每個實例對象中都存在一份,并且值可能是不一樣的。

    類(類對象):通過class定義的,又稱為類對象,是python解釋器在創建類的時候自動創建的。
    作用:1.通過類對象,去定義實例對象;2.類對象可以保存一些屬性信息,稱為類屬性
    類屬性的定義:在類內部,方法外部定義的變量就是類屬性。
    類屬性在內存中只有一份。

    如何確定一個屬性是該定義為實例屬性還是類屬性?
    先假設這個屬性為實例屬性,查看這個屬性值對于不同的實例對象,屬性值是否都一樣,并且需要同時變化。
    如果是,則可以定義為類屬性;如果不是,則可以定義為實例屬性。

    class Dog(object):# 定義類屬性, 類名class_name = '狗類'def __init__(self, name, age):# 定義的都是實例屬性self.name = nameself.age = agedog = Dog('大黃', 2) # 創建Dog類對象 print(dog.__dict__) # 打印dog對象具有的屬性,{'name': '大黃', 'age': 2}# 類名.__dict__:查看類對象具有的屬性,__module__魔法屬性 print(Dog.__dict__) # {'__module__': '__main__', 'class_name': '狗類', ...}# 訪問類屬性:類名.類屬性 print(Dog.class_name) # 狗類# 修改類屬性:類名.類屬性 = 屬性值 Dog.class_name = 'Dog類' print(Dog.class_name) # Dog類# 補充, 注意: 如果不存在和實例屬性名相同的類屬性,則可以使用實例對象訪問類屬性的值 # 如果存在重名,則使用實例屬性訪問的一定是實例屬性,不是類屬性 print(dog.class_name) # Dog類

    09、類方法

    """ 實例方法: 類中默認定義的方法就是實例方法,第一個參數為self,表示實例對象類方法: 使用@classmethod裝飾的方法,稱為類方法,第一個參數是cls,代表的是類對象自己 什么情況定義為實例方法,什么情況定義為類方法? 1.如果在方法中使用了實例屬性,那么該方法必須定義為實例方法; 2.前提:不需要使用實例屬性.需要使用類屬性,可以將這個方法定義為類方法. """ class Dog(object):class_name = '狗類'def __init__(self, name, age):self.name = nameself.age = agedef play(self): # 實例方法print(f"小狗{self.name},在快樂地玩耍...")# def get_class_name(self): # 是實例方法,因為沒有使用實例屬性,所以可以定義為類方法# return Dog.class_name@classmethoddef get_class_name(cls): # cls是類方法的默認形參,在調用的時候,不需要手動傳遞,python解釋器會自動傳遞return cls.class_namedog = Dog('大黃', 2) dog.play() # 小狗大黃,在快樂地玩耍... print(dog.get_class_name()) # 對象.類方法(),狗類 print(Dog.get_class_name()) # 類名.類方法(),狗類

    10、靜態方法[掌握]

    """ 實例方法:類中默認定義的方法,就是實例方法,第一個參數為self,表示實例對象 類方法:使用@classmethod裝飾的方法,稱為類方法,第一個參數是cls,代表的是類對象自己 靜態方法:使用@staticmethod裝飾的方法,稱為靜態方法,對參數沒有特殊要求,可以有,可以沒有 什么情況定義為實例方法,什么情況定義為類方法,什么情況下靜態方法? 1.如果在方法中使用了實例屬性,那么該方法必須定義為實例方法; 2.前提:不需要使用實例屬性.需要使用類屬性,可以將這個方法定義為類方法; 3.前提:不需要使用實例屬性,同時也不需要使用類屬性,此時可以將這個方法定義為靜態方法。 """ class Dog(object):class_name = '狗類'def __init__(self, name, age):self.name = nameself.age = agedef play(self): # 實例方法print(f"小狗{self.name},在快樂地玩耍...")@staticmethod # 定義靜態方法。靜態方法如果有參數,就必須傳遞實參值def show_info():print('這是一個Dog類!')dog = Dog('大黃', 2) dog.play() # 對象.方法名():小狗大黃,在快樂地玩耍... dog.show_info() # 調用方法1:對象.方法名(),這是一個Dog類! Dog.show_info() # 調用方法2:類名.方法名(),這是一個Dog類!

    11、多態[理解]

    什么是多態?在需要使用父類對象的地方,也可以使用子類對象,這種情況就叫多態。比如,在函數中,我需要調用某一個父類對象的方法,那么我們也可以在這個地方調用子類對象的方法。

    如何在程序中使用多態?可以按照以下幾個步驟來寫代碼:1.子類繼承父類;2.子類重寫父類中的方法;3.通過對象調用這個方法。

    多態的好處:給call_cure(doctor)函數傳遞哪個對象,在它里面就會調用哪個對象的cure()方法,也就是說在它里面既可以調用son對象的cure()方法,也能調用father對象的cure()方法,當然也可以在它里面調用Father類其它子類對象的cure()方法,這樣可以讓call_cure(doctor)函數變得更加靈活,額外增加了它的功能,提高了它的擴展性。

    """ 在需要使用父類對象的地方,也可以傳入子類對象,得到不同的結果----多態 實現步驟: 1.子類繼承父類; 2.子類重寫父類中的同名方法; 3.定義一個共同的方法,參數為父類對象,在方法中調用子類和父類同名的方法. """ # 1.定義DOg類 class Dog(object):def __init__(self, name):self.name = namedef play(self):print(f'小狗{self.name}, 在玩耍...')# 2.定義哮天犬類,繼承Dog類 class XTQ(Dog):# 3.重寫play方法def play(self):print(f'{self.name}, 在天上追云彩...')# 4.定義一個共同的方法, def play_with_dog(obj_dog):obj_dog.play()# 創建Dog類對象 dog = Dog('大黃') play_with_dog(dog) # 小狗大黃, 在玩耍...# 創建一個XTQ類的對象 xtq = XTQ('小黑') play_with_dog(xtq) # 小黑, 在天上追云彩...

    12、鴨子類型中的多態

    Python(解釋型語言、動態語言)中的多態可以沒有繼承:鴨子類型語言。

    # 1.定義DOg類 class Dog(object):def __init__(self, name):self.name = namedef play(self):print(f'小狗{self.name}, 在玩耍...')# 2.定義哮天犬類,繼承Dog類 class XTQ(Dog):# 3.重寫play方法def play(self):print(f'{self.name}, 在天上追云彩...')class Cat(object):def __init__(self, name):self.name = namedef play(self):print(f'小貓{self.name}, 被擼中...')# 4.定義一個共同的方法 def play_with_dog(obj_dog):obj_dog.play()# 創建Dog類對象 dog = Dog('大黃') play_with_dog(dog) # 小狗大黃, 在玩耍...# 創建一個XTQ類的對象 xtq = XTQ('小黑') play_with_dog(xtq) # 小黑, 在天上追云彩...# 創建一個貓類的對象 cat = Cat('小花') play_with_dog(cat) # 小貓小花, 被擼中...

    13、總結

    欲去“惰”字,以不晚起為第一義;欲去“驕”字,以不菲人為第一義;欲去“奢”字,以不浪費為第一義;欲去“病”字,以不頹廢為第一義。

    14、試題講解《python基礎中期考試》

    Python基礎day09【試題講解《python基礎中期考試》】

    總結

    以上是生活随笔為你收集整理的Python基础day09【面向对象(封装、继承、多态)、重写、私有权限】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。