面向對象的特征:繼承、封裝和多態,DAY18 面向對象三大特性之繼承

 2023-12-25 阅读 28 评论 0

摘要:繼承   繼承是一種創建新類的方式,在python中,新建的類可以繼承一個或多個父類。父類又被稱為超類,基類;新建的類稱為子類或者派生類。   在python3.x版本中,所有的類都默認繼承object類。 1.繼承與重用 面向對象的特征:繼承、封裝和多

繼承

  繼承是一種創建新類的方式,在python中,新建的類可以繼承一個或多個父類。父類又被稱為超類,基類;新建的類稱為子類或者派生類。

  在python3.x版本中,所有的類都默認繼承object類。

1.繼承與重用

面向對象的特征:繼承、封裝和多態。  首先,我們來看看一個例子:

# 貓類:吃喝睡,爬樹
# 狗類:吃喝睡,看家#一。通過之前對面向對象的學習,我們可以輕易的定義出這兩個類來:
class Cat:def __init__(self,name,kind,food):self.name = nameself.kind = kindself.food = fooddef eat(self):print('%s吃%s'%(self.name,self.food))def drink(self):print('%s喝水'%self.name)def sleep(self):print('%s在睡覺'%self.name)def climb(self):print('%s在爬樹'%self.name)class Dog:def __init__(self,name,kind,food):self.name = nameself.kind = kindself.food = fooddef eat(self):print('%s吃%s'%(self.name,self.food))def drink(self):print('%s喝水'%self.name)def sleep(self):print('%s在睡覺'%self.name)def look_after_home(self):print('%s在看家'%self.name)

  但是再往深入探討,我們會發現其實編寫的貓類和狗類代碼中,很多都冗余代碼。有什么方式能夠把重復的代碼提取出來嗎?當然有,這時候就可以用到繼承的思想,父類中的所有屬性和方法都可以被子類使用。

#二。把冗余的代碼提出來,抽象出一個寵物類,讓貓類和狗類都繼承這個寵物類。
class Pet:def __init__(self,name,kind,food):self.name = nameself.kind = kindself.food = fooddef eat(self):print('%s吃%s'%(self.name,self.food))def drink(self):print('%s喝水'%self.name)def sleep(self):print('%s在睡覺'%self.name)class Cat(Pet):def climb(self):print('%s在爬樹'%self.name)class Dog(Pet):def kanjia(self):print('%s在看家'%self.name)tom = Cat('Tom','暹羅貓','貓糧')   #子類使用名字(靜態變量和方法),如果在子類中沒有,就使用父類的
hei = Dog('小黑','二哈','狗糧')tom.climb()
hei.kanjia()

2.繼承與派生

  子類也可以定義自己特有的屬性或者重新這些屬性(但并不會影響到父類),一旦定義了自己的屬性且與父類同名時,這種屬性稱為派生屬性。子類的對象調用這個屬性時,會直接選擇子類中的。

class Pet:def __init__(self,name,kind,food):print('IN PET')self.name = nameself.kind = kindself.food = fooddef eat(self):print('%s吃%s'%(self.name,self.food))def drink(self):print('%s喝水'%self.name)def sleep(self):print('%s在睡覺'%self.name)class Cat(Pet):def __init__(self,name,kind,food,eye_color):print('IN CAT')self.eye_color = eye_color   #派生屬性# Pet.__init__(name,kind,food)super().__init__(name,kind,food)  #super方法,可以省去selfdef climb(self):print('%s在爬樹'%self.name)class Dog(Pet):def kanjia(self):print('%s在看家'%self.name)tom = Cat('阿貓','橘貓','貓糧','綠色')
print(tom.eye_color)
# 派生經典考題:
class Foo:def __init__(self):self.func()def func(self):print('in tho foo')class Son(Foo):def func(self):print('in the son')s1 = Son()
>>>
in the son################
當self去調用某個方法的時候,不要看self在哪里,而是要明確self代表的到底是誰。

  派生總結:

面向對象的繼承的定義。  1.當子類中方法要被調用的時候,子類的對象會直接選擇子類中的方法。

  2.父類的方法不會被自動執行。

  3.如果我們既要執行子類的方法又要執行父類中的方法,那么需要在子類的方法中調用父類的方法,有以下兩種方法:

  (1)父類名.方法名(self,參數...)

  (2)super().方法名(參數...)? ?#關于super的查找順序,請繼續往下看。

面向對象的四個基本特征?3.抽象類

  抽象類在python中使用的不是特別多,但是在以后的工作中,公司有可能會使用抽象類來制定開發的規則,在以后看源碼的過程中,也可能會碰到抽象類的概念。試想一個場景:在今后的多人開發,功能復雜,許多后期拓展功能的項目中,代碼的規范變得尤其的重要,而此時,抽象類就能夠起到一個很好的模板作用。

  抽象類只是一個模板的規范,基本不會實現什么功能,所以抽象類是不可以被實例化的。

#定義抽象類,需要引入一個模塊。from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta):       #抽象類必須繼承一個叫ABCMeta的類@abstractmethod                     #抽象類規定的方法,用abstractmethod裝飾器裝飾,規定了def pay(self):pass                   后面凡是繼承該抽象類的子類都必須有一個同名的方法。class Alipay(Payment):def pay(self,money):print('使用支付寶支付了%s元'%money)

4.多繼承

  在python中允許一個子類是可以繼承多個父類的。

class ParentClass1:  #定義父類1passclass ParentClass2:  #定義父類2passclass ChildClass(ParentClass1):   #定義子類(繼承父類1) 單繼承passclass ChildClass2(ParentClass1,ParentClass2):  #多繼承pass

面向對象的特性有哪些,  “__base__”:顯示子類的一個父類。

  “__bases__”:顯示子類的所有父類。

5.新式類與經典類

  python3.x所有的類都是新式類,所有的新式類都有一個默認繼承的父類,叫做object類。

  python2.7中經典類和新式類并存。

面向對象的方法中、    class Student:Pass? ?#經典類

    class Student(object):pass? #新式類

  總結:

  (1)繼承了object的類都是新式類。

  (2)在py3中所有的類都是新式類。

繼承是指、  (3)在py2中既有新式類也有經典類。

?

  一.多繼承的順序/新式類和經典類之間的區別?

 (1)鉆石繼承:廣度優先。

  新式類的所有多繼承關系尋找方法的順序--->遵循廣度優先。

java中面向對象的三大特征,  mro()--->顯示多繼承的繼承順序。

  super()--->super方法不是單純的尋找父類,在多繼承中,是遵循mro循序的。

class A:def func(self):print('A')class B(A):def func(self):super().func()print('B')class C(A):def func(self):super().func()print('C')class D(B,C):def func(self):super().func()print('D')d = D()
d.func()
print(D.mro())              #新式類遵循廣度優先。
>>>
A
C
B
D
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

  

 總結:

  新式類在多繼承時,遵循廣度優先。

面向對象和面向過程。  經典類在多繼承時,遵循深度優先。

  

轉載于:https://www.cnblogs.com/hebbhao/p/9549579.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/194939.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息