<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] ### **繼承:** ``` 1.子類擁有父類的屬性和方法(私有屬性 和 私有方法除外) 2.繼承的優點: ① 去除重復代碼 ② 簡化代碼結構 3.語法: class 子類名(父類名) 4.子類繼承父類后,就可以調用父類的屬性和方法 5.子類中可以自定義自己的屬性和方法 6.繼承中,父類不能使用子類的屬性和方法 7.多層繼承,孫子類繼承了父親類,父親類繼承了爺爺類, 孫子可以直接使用爺爺的方法/屬性, 爺爺類/父類 不能訪問孫子類中的屬性和方法 8.注意: 繼承不是復制,訪問子類屬性時,先到子類中查找,子類中沒有該屬性,則去父類中查找 ``` <details> <summary>實現單繼承.py</summary> ``` # 目標:實現單繼承 # 定義Animal類 class Animal: '''動物類''' def __init__(self): self.name = "動物" self.age = 2 def eat(self): print("%s 都愛吃..." % self.name) class Cat(Animal): # 單繼承 子類(父類) '''貓類''' def catch(self): print("小貓抓老鼠...") animal = Animal() print(animal.name) print(animal.age) animal.eat() # 父類對象無法調用子類的方法,也不能訪問子類的屬性 # animal.catch() print("-" * 50) tom = Cat() print(tom.name) print(tom.age) # 子類對象可以調用父類的方法 tom.eat() # 繼承不是復制 # 訪問子類屬性時,先到子類中查找 # 子類中沒有該屬性,則去父類中查找 ``` </details> <br /> <details> <summary>03_方法重寫_功能覆蓋.py</summary> ``` # 目標:實現 03_方法重寫_功能覆蓋 ''' 重寫: 概念:子類中有與父類相同的方法名,子類重寫了父類的方法 原因:父類的方法不能滿足子類的需求 前提:方法重寫的前提條件,要有繼承關系 分類: 1. 功能覆蓋: 子類重寫的方法與父類完全不同 2. 功能擴展: 在父類方法基礎上進行功能擴展 注意:子類重寫了父類的方法后,調用方法時,調用的是自己重寫后的方法 ''' # 爺爺類 class Animal: '''動物類''' def __init__(self): self.name = "動物" self.age = 2 def eat(self): print("%s 都愛吃..." % self.name) # 父類 class Cat(Animal): # 單繼承 子類(父類) '''貓類''' def catch(self): print("小貓抓老鼠...") # 孫子類 class BoSimao(Cat): '''波斯貓類''' def catch(self): print("波斯貓抓魚吃...") bsm = BoSimao() # 子類重寫了父類的方法后,調用方法時,調用的是自己重寫后的方法 bsm.catch() ``` </details> <br /> <details> <summary>04_方法重寫_功能擴展.py</summary> ``` # 目標:實現 04_方法重寫_功能擴展 # 爺爺類 class Animal: '''動物類''' def __init__(self): self.name = "動物" self.age = 2 def eat(self): print("%s 都愛吃..." % self.name) # 父類 class Cat(Animal): # 單繼承 子類(父類) '''貓類''' def catch(self): print("小貓抓老鼠...") # 孫子類 class BoSimao(Cat): '''波斯貓類''' def catch(self): # 功能擴展:在子類重寫的方法中調用父類的方法, # 1. super().重寫的方法名() super().catch() # 2. 父類名.方法名(self) # 不推薦使用,父類名修改后,在調用的地方也需要修改父類名,不方便 Cat.catch() print("波斯貓抓魚吃...") bsm = BoSimao() # 子類重寫了父類的方法后,調用方法時,調用的是自己重寫后的方法 bsm.catch() ``` </details> <br /> ``` super類的總結: 1. super是一種特殊的類 2. super()通過super類創建的實例對象 3.使用super類創建的實例對象調用重寫父類的方法,可以做到對父類的方法進行功能擴展 父類的私有屬性和私有方法: 1.子類不能直接訪問父類的私有屬性 2.子類不能直接調用父類的私有方法 3.通過對外提供訪問私有屬性方法,間接訪問 def get_pwd(self): '''獲取私有屬性''' return self.__password def set_pwd(self, new_pwd): '''設置私有屬性''' self.__password = new_pwd def func_secret(self): '''調用私有方法''' self.__secret() ``` <details> <summary>05_繼承中的私有屬性和私有方法.py</summary> ``` # 05_繼承中的私有屬性和私有方法 class Father: '''父類''' def __init__(self): self.name = "老王" # 前置雙下劃線的屬性是私有屬性 self.__password = 123456 # 在類的內部對外提供訪問私有屬性的借口 get / set def get_pwd(self): '''獲取私有屬性''' return self.__password def set_pwd(self, new_pwd): '''設置私有屬性''' self.__password = new_pwd def func_secret(self): '''調用私有方法''' self.__secret() def eat(self): '''吃方法''' # 在類內可以使用 self.私有屬性名 訪問私有屬性 print("%s 愛吃東西,使用密碼是%d,可以買東西" % (self.name, self.__password)) def __secret(self): '''私有方法''' # 前置雙下劃線的方法是私有方法 print("%s 的個人秘密,銀行卡密碼是:%d" % (self.name, self.__password)) class Son(Father): '''子類''' def run(self): '''跑方法''' print("小王喜歡游山玩水...") xiao_wang = Son() print(xiao_wang.name) # 在類外,子類對象無法直接訪問父類的私有屬性 # print(xiao_wang.__password) xiao_wang.eat() # 在類外,子類對象無法直接訪問父類的私有方法 # xiao_wang.__secret() print(dir(xiao_wang)) ret = xiao_wang.get_pwd() print(ret) xiao_wang.set_pwd(10086) ret = xiao_wang.get_pwd() print(ret) ``` </details> <br /> ### **多繼承:** ``` 1.一個子類繼承多個父類 2.格式:子類(父類名1,父類名2...) 3.多繼承時,子類擁有父類的所有方法和屬性(不包括私有屬性和私有方法) ``` <details> <summary>06_多繼承.py</summary> ``` # 06_多繼承 ''' 騾子 是 驢和馬的后臺 騾子 mule 驢 donkey 馬 horse ''' class Horse: '''馬類''' def __init__(self): self.name = "馬" def run(self): print("馬跑得快") class Donkey: '''驢類''' def walk(self): print("驢走得遠") class Mule(Horse, Donkey): # 多繼承 子類(子類1,子類2) '''騾子類''' pass # 多繼承中,子類可以訪問所有父類中所有屬性和方法(不包含私有屬性和私有方法) mu = Mule() print(mu.name) mu.run() mu.walk() ``` </details> <br /> <details> <summary>07_多繼承中父類有相同的方法.py</summary> ``` # 07_多繼承中父類有相同的方法 class Horse: '''馬類''' def run(self): # 跑方法 print("馬跑得快") def walk(self): # 走方法 print("馬走不遠") class Donkey: '''驢類''' def walk(self): print("驢走得遠") def run(self): # 跑方法 print("驢跑不快") class Mule(Horse, Donkey): # 多繼承 子類(子類1,子類2) '''騾子類''' pass mu = Mule() mu.run() mu.walk() # __mro__ 方法解析順序 print(Mule.__mro__) ''' 多繼承,父類有相同的方法名,參考 __mro__ 方法解析順序來調用 1.查看 創建當前對象mu 的類模板 Mule 2.拿著類模板 Mule到 __mro__ 方法解析順序 查找 3.如果找到了,則調用其中的方法,如果沒有調用的方法,查找下一個類中的方法 4.最終都沒有找到對應的方法,則報錯 ''' ``` </details> <br /> ``` python2.x解釋器是經典類 默認不繼承 object python3.x解釋器是新式類 默認繼承 object 推薦大家定義類時,加上繼承 object class Animal(object): pass ``` <details> <summary>08_多態.py</summary> ``` # 08_多態 ''' 1. 在 Dog 類中封裝方法 game 普通狗只是簡單的玩耍 2. 定義 XiaoTianDog 繼承自 Dog ,并且重寫 game 方法 哮天犬需要在天上玩耍 3. 定義 Person 類,并且封裝一個 和狗玩 的方法 在方法內部,直接讓 狗對象 調用 game 方法 ''' class Dog: '''普通狗類''' def __init__(self, name): self.name = name def game(self): '''玩耍的方法''' print("普通狗只是在地上簡單的玩耍") class XianTianQuan(Dog): '''哮天犬類''' def __init__(self, name): self.name = name def game(self): print("%s 在天上快樂的玩耍" % self.name) class Person: '''人類''' def __init__(self, name): self.name = name def play_with_dog(self, dog): print("人物:%s 和 狗對象:%s 一起玩耍" % (self.name, dog.name)) # 狗對象 調用 game 方法 # 不同的對象 調用相同的方法,產生不同的結果狀態,叫做多態 dog.game() wang_cai = Dog("旺財") xtq = XianTianQuan("哮天犬") changwei = Person("常威") # 調用和狗玩的方法 changwei.play_with_dog(wang_cai) print("-" * 50) changwei.play_with_dog(xtq) ''' 多態成立的三個條件: 1.要有繼承 2.要有方法的重寫 3.要有父類的對象或子類的對象作為方法的參數 Python中的多態是"鴨子模型", Python中的多態要求不是很嚴格 ''' ``` </details> <br /> ``` 一個類模板可以創建多個實例對象, 每個實例對象的內存空間彼此獨立,互不干擾, 實例屬性保存在實例對象的內存空間, 實例方法保存在類模板中的, 但是,使用實例對象調用實例方法時,是一個動態綁定的過程。 ``` <details> <summary>09_實例對象_實例屬性_實例方法.py</summary> ``` # 09_實例對象_實例屬性_實例方法 class Person(object): '''人類''' def __init__(self, name): self.name = name def eat(self): print("%s 愛吃美食..." % self.name) xiao_ming = Person("小明") print(xiao_ming) print(xiao_ming.name) # 實例對象中的屬性是 實例屬性 print("id(xiao_ming.name):", id(xiao_ming.name)) xiao_ming.eat() # 實例對象可以調用的方法,并且具有self參數,是實例方法 print("id(xiao_ming.eat):", id(xiao_ming.eat)) print("-" * 50) xiao_wang = Person("小王") print(xiao_wang) print(xiao_wang.name) print("id(xiao_wang.name):", id(xiao_wang.name)) xiao_wang.eat() print("id(xiao_wang.eat):", id(xiao_wang.eat())) ``` </details> <br /> ### **類對象:** ``` 1.類模板就是類對象 2. Python解釋器遇到 class關鍵字, class關鍵字后面的變量名就是類對象名, 類對象名保存類模板空間地址引用 3.類對象一般只有一個,實例對象可以有多個,通過類對象創建實例對象 4. Python中一切皆對象,函數,數字,方法,類都是對象 ``` <details> <summary>10_類對象.py</summary> ``` # 10_類對象 class Person(object): '''人類''' def __init__(self, name): self.name = name def eat(self): print("%s 愛吃美食..." % self.name) print(Person) print("id(Person):", id(Person)) ``` </details> <br /> ### **類屬性:** 作用:主要用來記錄類對象的相關特征 1. 也是一種屬性,屬于類對象的屬性(存在類模板中),在創建類對象時只被初始化一次 2. 定義在類的內部,方法外部 3. 訪問類屬性的方式 ①.類名.類屬性名(推薦) ②.實例對象名.類屬性名(不推薦) 4. 注意:通過實例對象并沒有修改類屬性的值,而是定義了一個與類屬性同名的實例屬性 5. 使用類屬性可以在不破壞類的封裝特性前提下實現某些功能 <details> <summary>11_類屬性.py</summary> ``` # 11_類屬性 # 需求:統計當前類模板創建了幾個實例對象 # 類模板就是一個對象,簡稱類對象 class Person(object): '''人類''' # 類屬性,定義在方法外邊,類的內部 # 作用:主要用來記錄類對象的相關特征 count = 0 print("----類模板初始化一次----") def __init__(self, name): # 實例屬性 self.name = name print("---初始化方法__init__----") # 使用 類屬性 統計當前類模板創建了幾個實例對象 # 訪問類屬性,使用 類名.屬性名 Person.count += 1 def eat(self): print("%s 愛吃美食..." % self.name) xiao_ming = Person("小明") xiao_wang = Person('小王') xiao_wang = Person('小王1') # 類外訪問 類屬性的方式 # 1.類名.類屬性名 print("當前創建實例對象個數是:" ,Person.count) # 2.實例對象.類屬性名 print("xiao_ming.count:", xiao_ming.count) print("-" * 50) # 修改類屬性 # 類名.類屬性 = 值 Person.count = 10 print('當前類屬性的值,Person.count:', Person.count) # 實例對象.類屬性 = 值 # 注意:使用 實例對象,類屬性的方式 不能修改類屬性的值 # 僅僅是 給實例對象添加了一個 同類屬性同名 xiao_ming.count = 20 # Error print("xiao_ming.count:", xiao_ming.count) print('當前類屬性的值,Person.count:', Person.count) ``` </details> <br /> ### **類方法:** ``` 1.類方法是一種特殊的方法,用來處理類屬性或調用其它類方法 2.定義類方法,只需要在普通方法上面添加 @classmethod,第一個參數是cls 格式:@classmethod def 方法名(cls): pass 3.注意@classmethod是一種語法糖(語法現象),裝飾器( 修飾器),告訴 python解釋器,當前的方法是特殊的方法(類方法) 4.參數cls表示調用當前方法的類對象的引用 5.調用類方法: ①類名類方法名() 推薦 ②實例對象名類方法名() 不推薦使用(因為實例對象一般訪問的是實例方法) ``` <details> <summary>12_類方法.py</summary> ``` # 12_類方法 class Person(object): '''人類''' # 類屬性,定義在方法外邊,類的內部 # 作用:主要用來記錄類對象的相關特征 count = 0 def __init__(self, name): # 實例屬性 self.name = name def eat(self): print("%s 愛吃美食..." % self.name) # 裝飾器,也叫修飾器,告訴python解釋器,這是一個類方法,特殊對待,不要報錯 @classmethod def get_count(cls): '''類方法''' print("1.類方法的作用:處理類屬性 或 調用其他類方法") print("2.cls參數保存的是當前類對象的引用,cls:", cls) cls.count += 100 return cls.count print(Person) # 調用類方法 # 類對象名.類方法名() ret = Person.get_count() print(ret) xiao_ming = Person("小明") ret = xiao_ming.get_count() print(ret) ``` </details> <br /> ### **靜態方法:** ``` 1.靜態方法既不需要self參數,也不需要cls參數 2.靜態方法中不需要用到實例對象的實例屬性和實例方法,也不需要用到類對象的類屬性和類方 3.靜態方法不會破壞類的封裝性 4.定義靜態方法,只需要在普通方法上面添加@staticmethod,沒有參數(可以手動人為的添加 格式: @staticmethod def 靜態方法名(): pass 5.裝飾器@staticmethod裝飾的是靜態方法名,告訴 python解釋器下面的方法是特殊的方法, 6.調用靜態方法 ①類名靜態方法名() ②實例對象名,靜態方法名() 7.使用場景:比如打印菜單等簡單的操作 ``` <details> <summary>13_靜態方法.py</summary> ``` # 13_靜態方法 class Person(object): '''人類''' # 類屬性,定義在方法外邊,類的內部 # 作用:主要用來記錄類對象的相關特征 count = 0 def __init__(self, name): # 實例屬性 self.name = name def eat(self): print("%s 愛吃美食..." % self.name) # 裝飾器,也叫修飾器,告訴python解釋器,這是一個類方法,特殊對待,不要報錯 @classmethod def get_count(cls): '''類方法''' print("1.類方法的作用:處理類屬性 或 調用其他類方法") print("2.cls參數保存的是當前類對象的引用,cls:", cls) cls.count += 100 return cls.count @staticmethod def func_static(): '''靜態方法''' print("1.靜態方法中不需要self參數,也不需要cls參數") print("2.靜態方法中不需要實例屬性,也不需要類屬性") print("3.靜態方法中不需要實例方法,也不需要類方法") print("4.靜態方法還不能破壞類的封裝性") @staticmethod def get_sum(a, b): print("%d + %d = %d" % (a, b, a+b)) # 調用靜態方法 # 類名.靜態方法名() Person.func_static() print("-" * 50) # 實例對象.靜態方法名() xiao_hua = Person("小花") xiao_hua.func_static() xiao_hua.get_sum(10, 20) ``` </details> <br /> <br /> <details> <summary>14_案例實現.py</summary> ``` # 14_案例實現 ''' 1.設計一個 Game 類 2.屬性 定義一個類屬性 top_score 記錄游戲的 歷史最高分 定義一個實例屬性 player_name 記錄 當前游戲的玩家姓名 3.方法 靜態方法 show_help 顯示游戲幫助信息 類方法 show_top_score 顯示歷史最高分 實例方法 start_game開 始當前玩家的游戲 4.主程序步驟 1)查看幫助信息 2)查看歷史最高分 3)創建游戲對象,開始游戲 ''' class Game: '''游戲類''' # 類屬性 記錄游戲的 歷史最高分 top_score = 0 def __init__(self, player_name): # 記錄 當前游戲的玩家姓名 self.player_name = player_name @staticmethod def show_help(): '''靜態方法''' print("顯示游戲幫助信息:不能讓僵尸走進房間") @classmethod def show_top_score(cls): '''類方法''' print("顯示歷史最高分:", cls.top_score) def start_game(self): '''實例方法''' print("游戲開始...") print("%s 玩家玩的很happy..." % self.player_name) # 修改歷史最高分 Game.top_score += 100 # 4.主程序步驟 # 1)查看幫助信息 Game.show_help() # 2)查看歷史最高分 Game.show_top_score() # 3)創建游戲對象,開始游戲 xiao_ming = Game("小明") xiao_ming.start_game() Game.show_top_score() ``` </details> <br />
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看