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

      歡迎訪問 生活随笔!

      生活随笔

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

      python

      div不继承父类样式_Python编程思想(27):类的继承

      發布時間:2024/7/5 python 28 豆豆
      生活随笔 收集整理的這篇文章主要介紹了 div不继承父类样式_Python编程思想(27):类的继承 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
      -----------支持作者請轉發本文-----------李寧老師已經在「極客起源」 微信公眾號推出《Python編程思想》電子書,囊括了Python的核心技術,以及Python的主要函數庫的使用方法。讀者可以在「極客起源」 公眾號中輸入?160442?開始學習。-----------正文-----------繼承是面向對象的3大特征之一(另兩個特性是封裝和組合),也是實現軟件復用的重要手段。Python的繼承是多繼承機制,也就是一個子類可以同時有多個直接父類。1. ?繼承的語法Python子類繼承父類的語法是在定義子類時,將多個父類放在子類之后的圓括號中。語法格式如下:class SubClass(SuperClassl, SuperClass2,..) # 類定義部分從上面的語法格式來看,定義子類的語法非常簡單,只需在原來的類定義后增加圓括號,并在圓括號中添加多個父類,即可表明該子類繼承了這些父類。如果在定義一個 Python類時并未顯式指定這個類的直接父類,則這個類默認繼承 object類。因此,object類是所有類的父類,要么是其直接父類,要么是其間接父類。實現繼承的類被稱為子類,被繼承的類被稱為父類,也被稱為基類、超類。父類和子類的關系是一般和特殊的關系。例如水果和香蕉的關系,香蕉繼承了水果,香蕉是水果的子類,則香蕉是種特殊的水果。由于子類是一種特殊的父類,因此父類包含的范圍總比子類包含的范圍要大,所以可以認為父類是大類,而子類是小類。從實際意義上看,子類是對父類的擴展,子類是一種特殊的父類。從這個意義上看,使用繼承來描述子類和父類的關系是不準確的,用擴展更恰當。因此,這樣的說法更加準確:Banana類擴展了Fruit類。從子類的角度來看,子類擴展( extend)了父類,但從父類的角度來看,父類派生(derive)出子類。也就是說,擴展和派生所描述的是同一個動作,只是觀察角度不同而已。下面程序示范了子類繼承父類的特點。下面是 Fruit類的代碼。示例代碼:inherit.pyclass Fruit: def info(self): print(f"我是水果!重{self.weight}克" )class Food: def taste(self): print("不同食物的口感不同")# 定義Banana類,繼承了Fruit和Food類class Banana(Fruit, Food): pass# 創建Banana對象b = Banana()b.weight = 16# 調用Banana對象的info()方法b.info()# 調用Banana對象的taste()方法b.taste()這段代碼開始定義了兩個父類:Fruit類和Food類,接下來程序定義了一個 Banana類,該 Banana類是一個空類。在主程序部分,主程序創建了 Banana對象之后,可以訪問Banana對象的info()和 taste()方法,這表明 Banana對象也具有了info和 taste方法,這就是繼承的作用:子類擴展(繼承)了父類。在子類中將可以繼承得到父類定義的方法,這樣子類就可復用父類的方法了。2. ?關于多繼承大部分面向對象的編程語言(除了C++)都只支持單繼承,而不支持多繼承,這是由于多繼承不僅增加了編程的復雜度,而且很容易導致一些莫名的錯誤。Python雖然在語法上明確支持多繼承,但建議如果不是很有必要,則盡量不要使用多繼承,而是使用單繼承,這樣可以保證編程思路更清晰,而且可以避免很多麻煩。當一個子類有多個直接父類時,該子類會繼承得到所有父類的方法,這一點在前面代碼中已經演示了。現在的問題是,如果多個父類中包含了同名的方法,此時會發生什么呢?此時排在前面的父類中的方法會“遮蔽”排在后面的父類中的同名方法。示例代碼:multiple_inherit.pyclass Item: def info (self): print("Item中方法:", '這是一個商品') class Product: def info (self): print("Product中方法:", '這是一個移動產品')class Mouse1(Item, Product): passclass Mouse2(Product, Item): passm1 = Mouse1()m1.info()m2 = Mouse2()m2.info()在這段代碼中讓 Mouse1繼承了Item類和 Product類,Mouse2繼承了Product類和Item類,這兩個類的父類繼承順序是相反的。由于Mouse1類的Item排在前面,因此Item中定義的方法優先級更高, Python會優先到Item父類中搜尋方法,一旦在Item父類中搜尋到目標方法,Python就不會繼續向下搜尋了。上面程序中Item和 Product兩個父類中都包含了info()方法,當 Mouse1子類對象調用info方法時,子類中沒有定義info方法,因此 Python會從父類中尋找info方法,此時優先使用第1個父類Item中的info方法。而Mouse2子類對象調用的info()方法屬于Product類。運行上面程序,將看到如下輸出結果:Item中方法: 這是一個商品 Product中方法: 這是一個移動產品3. 重寫父類的方法子類擴展了父類,子類是一種特殊的父類。大部分時候,子類總是以父類為基礎,額外增加新的方法。但有一種情況例外:子類需要重寫父類的方法。例如鳥類都包含了飛翔方法,其中鴕鳥是種特殊的鳥類,因此鴕鳥應該是鳥的子類,它也將從鳥類獲得飛翔方法,但這個飛翔方法明顯不適合鴕鳥,因此,鴕鳥需要重寫鳥類的方法。示例代碼:override.pyclass Bird: # Bird類的fly()方法 def fly(self): print("我在天空里自由自在地飛翔...")class Ostrich(Bird): # 重寫Bird類的fly()方法 def fly(self): print("我只能在地上奔跑...") # 創建Ostrich對象os = Ostrich()# 執行Ostrich對象的fly()方法,將輸出"我只能在地上奔跑..."os.fly()運行上面程序,將看到運行os.fly()時執行的不再是Bird類的fly()方法,而是 Ostrich類的fly()方法。這種子類包含與父類同名的方法的現象被稱為方法重寫(Override),也被稱為方法覆蓋。可以說子類重寫了父類的方法,也可以說子類覆蓋了父類的方法。4. 使用未綁定方法調用被重寫的方法如果在子類中調用重寫之后的方法,Python總是會執行子類重寫的方法,不會執行父類中被重寫的方法。如果需要在子類中調用父類中被重寫的實例方法,那該怎么辦呢?讀者別忘了,Python類相當于類空間,因此 Python類中的方法本質上相當于類空間內的函數。所以,即使是實例方法,Python也允許通過類名調用。區別在于,在通過類名調用實例方法時,Python不會為實例方法的第1個參數self自動綁定參數值,而是需要程序顯式綁定第一個參數self。示例代碼:invoke_parent. pyclass BaseClass: def name (self): print('父類中定義的name方法')class SubClass(BaseClass): # 重寫父類的name方法 def name (self): print('子類重寫父類中的name方法') def process (self): print('執行process方法') # 直接執行name方法,將會調用子類重寫之后的name()方法 self.name() # 使用類名調用實例方法調用父類被重寫的方法 BaseClass.name(self)sc = SubClass()sc.process()上面程序中 SubClass繼承了 BaseClass類,并重寫了父類的name()方法。接下來程序在 SubClass類中定義了process()方法,該方法直接通過self調用name方法, Python將會執行子類重寫之后的name方法。后面的代碼通過顯式調用 Base_Class 中的name方法,并顯式為第1個參數self綁定參數值,這就實現了調用父類中被重寫的方法。5. ?使用 super函數調用父類的構造方法Python的子類也會繼承得到父類的構造方法,如果子類有多個直接父類,那么排在前面的父類的構造方法會被優先使用。例如如下代碼:示例代碼: super:pyclass Employee : def __init__ (self, salary): self.salary = salary def work (self): print('普通員工正在寫代碼,工資是:', self.salary)class Customer: def __init__ (self, favorite, address): self.favorite = favorite self.address = address def info (self): print(f'我是一個顧客,我的愛好是: {self.favorite},地址是{self.address}' )class Manager1 (Employee,Customer): passclass Manager2 (Customer, Employee): passm1 = Manager1(1235)m1.work()m2 = Manager2('服務器', '北京')m2.info()上面程序中定義了 Manager1類,該類繼承了 Employee和 Customer兩個父類。接下來程序中的Manager類將會優先使用 Employee類的構造方法(因為它排在前面),所以程序使用Manager(1235)來創建 Manager1對象。該構造方法只會初始化 salary實例變量,因此執行上面程序是沒有任何問題的。但如果為Manager2傳遞一個數值就會引發錯誤,因為Manager2使用了Customer的構造方法,因此應該使用Manager2('服務器', '北京')創建Manager2對象。為了讓 Manager能同時初始化兩個父類中的實例變量,Manager應該定義自己的構造方法就是重寫父類的構造方法。Python要求:如果子類重寫了父類的構造方法,那么子類的構造方法必須調用父類的構造方法。子類的構造方法調用父類的構造方法有兩種方式。
      • 使用未綁定方法,這種方式很容易理解。因為構造方法也是實例方法。當然可以通過這種方式來調用;

      • 使用supe()函數調用父類的構造方法;

      在交互式解釋器中輸入help(super)查看 super()函數的幫助信息,可以看到如下輸出信息。class super(object) super() -> same as super(__class__, ) super(type) -> unbound super object super(type, obj) -> bound super object; requires isinstance(obj, type) super(type, type2) -> bound super object; requires issubclass(type2, type) Typical use to call a cooperative superclass method: class C(B): def meth(self, arg): super().meth(arg) This works for class methods too: class C(B): @classmethod def cmeth(cls, arg): super().cmeth(arg) Methods defined here: __get__(self, instance, owner, /) Return an attribute of instance, which is of type owner. __getattribute__(self, name, /)從輸出的內容可以看出,super其實是一個類,因此調用 super()的本質就是調用 super類的構造方法來創建 super對象。從上面的幫助信息可以看到,使用 super()構造方法最常用的做法就是不傳入任何參數(這種做法與 super(type,obj)的效果相同),然后通過 super對象的方法既可調用父類的實例方法,也可調用父類的類方法。在調用父類的實例方法時,程序會完成第1個參數self的自動綁定。現在將上面的代碼改成下面的形式:class Employee : def __init__ (self, salary): self.salary = salary def work (self): print('普通員工正在寫代碼,工資是:', self.salary)class Customer: def __init__ (self, favorite, address): self.favorite = favorite self.address = address def info (self): print(f'我是一個顧客,我的愛好是: {self.favorite},地址是{self.address}')# Manager繼承了Employee、Customerclass Manager(Employee, Customer): # 重寫父類的構造方法 def __init__(self, salary, favorite, address): print('--Manager的構造方法--') # 通過super()函數調用父類的構造方法 super().__init__(salary) # 使用未綁定方法調用父類的構造方法 Customer.__init__(self, favorite, address)# 創建Manager對象m = Manager(25000, 'IT產品', '廣州')m.work()m.info()在這段代碼中兩行粗體字代碼分別示范了兩種方式調用父類的構造方法。通過這種方式,Manager類重寫了父類的構造方法,并在構造方法中顯式調用了父類的兩個構造方法執行初始化,這樣兩個父類中的實例變量都能被初始化。運行上面程序,可以看到如下運行結果:--Manager的構造方法--普通員工正在寫代碼,工資是: 25000我是一個顧客,我的愛好是: IT產品,地址是廣州往期回顧:Python編程思想(23):類和對象Python編程思想(24):類的實例方法Python編程思想(25):方法深度解析Python編程思想(26):成員變量對本文感興趣,可以加李寧老師微信公眾號(unitymarvel):

      關注? 極客起源? 公眾號,獲得更多免費技術視頻和文章。

      總結

      以上是生活随笔為你收集整理的div不继承父类样式_Python编程思想(27):类的继承的全部內容,希望文章能夠幫你解決所遇到的問題。

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

      主站蜘蛛池模板: 欲色综合 | 久久99深爱久久99精品 | 亚洲精品白浆高清久久久久久 | 伊人欧美 | 欧美精品乱人伦久久久久久 | 精品欧美乱码久久久久久1区2区 | 一区二区亚洲 | 天天鲁| 国产精品天美传媒入口 | 在线观看黄色大片 | 色婷婷狠狠干 | 成人午夜视频免费观看 | 欧美日韩aaa| 在线成人看片 | 国产一区二区视频在线播放 | 夫妻毛片 | 99精品欧美一区二区三区 | 一级免费视频 | 国产做爰全过程免费视频 | 无码国产精品一区二区色情男同 | 日本wwwwww | av导航大全| 黄色av网| 天天插日日插 | 伊人焦久影院 | 日韩av电影网 | 国产7777777| 亚洲涩色 | 色先锋av | 五月婷婷影院 | 操操操视频 | 黄色美女视频网站 | 国产亚洲一区在线 | 7m精品福利视频导航 | 岛国片在线播放 | 国产嫩草av | 国产亚洲精品码 | 九九视频免费看 | 欧美性视频一区二区三区 | 日本久久一级片 | 国产精品jizz在线观看无码 | 久久久久无码国产精品一区李宗瑞 | 成人免费播放 | 天天爽天天爱 | 成人91在线观看 | 欧美成人精品一区二区 | 亚洲aa在线 | 夫妻性生活自拍 | 蘑菇福利视频一区播放 | 成人av动漫在线 | 99在线观看免费 | 天天亚洲 | 国产精品无码内射 | 999国产精品视频 | 成人蜜桃视频 | 精品人妻天天爽夜夜爽视频 | 亚洲自拍偷拍综合 | 深夜福利网站 | 久久新 | 在线免费观看视频黄 | 成人免费视 | 91国在线 | 乱子伦一区二区三区 | 男女做激情爱呻吟口述全过程 | 久久avav | 潘金莲三级80分钟 | 欧美精品在线一区二区三区 | 福利在线一区二区 | www.日本精品 | 黄色成人影视 | 久久国产免费 | 亚洲成人黄色影院 | 一色桃子juy758在线播放 | 日日操日日操 | 国产美女啪啪 | xxxx日本黄色 | 亚洲综合av一区二区三区 | 佐佐木明希电影 | 日韩在线观看视频网站 | 日本三级视频 | 韩国三级hd中文字幕的背景音乐 | 日韩av午夜 | 无码人妻丰满熟妇精品区 | 四虎最新网址在线观看 | 精品国产乱码久久久久久影片 | 精品久久a | 精品亚洲aⅴ无码一区二区三区 | 欧美天堂一区 | 黄色av影院 | 综合网久久 | 色吧五月天| 麻豆精品一区二区 | 不卡的免费av | 日韩精品极品视频免费观看 | 黄色天堂网 | www日本www | 老司机成人网 | 国产精品高潮呻吟av | 亚洲激情在线观看 |