天天看點

Python進階-----面對對象4.0(面對對象三大特征之--繼承)

目錄

前言:

Python的繼承簡介

1.什麼是繼承 

2.繼承的好處

 3.object類

繼承的相關用法

 1.繼承的定義與法則

2.對繼承的重寫

 3.(單繼承)多層繼承

4.多繼承

 5.多繼承重寫時調用父類方法

前言:

        在講之前,我想說說中國古代曆史。我們都知道在古代,君王的傳位是遵循嫡長子繼承制的,皇帝的位置一般是傳給太子的,那在繼承的過程中也就是說皇帝的所有權利以及所擁有的東西都會傳給下一個皇帝,但是相關的規矩一般是不會變化的,比如說朝代的國号以及一些重要制度,但是這不代表新皇帝不可以去改革,比如戰國時期秦國的商鞅變法。

        好了這裡講這麼多,我們對“繼承”這個詞有點了解吧,在Python中也基本上是遵循這樣的規則的,廢話不多說,一起來看看吧!!!

Python的繼承簡介

1.什麼是繼承 

        繼承嘛,顧名思義就是後者繼承先者的某些特征和屬性,比如說:兒子繼承老爸的股份,太子繼承皇位等等。在Python中,被繼承的類叫做父類,繼承的類叫做子類,子類繼承父類的屬性和方法

2.繼承的好處

  • 繼承可以解決重複類的代碼造成的備援
  • 繼承可以提高代碼的複用性

 3.object類

在python中所有的類都繼承于object,object就是基類,超類 ,是以object類是所有類的父類
class A:
    pass
class B(object):
    pass
#object類是所有類的父類,也就是說如果一個類沒有指定繼承哪個類,那麼就會預設繼承object類
#是以A和B類都是繼承object類,是一樣的
           

我們可以去通過dir()  來擷取object類具有的方法,如下所示:

Python進階-----面對對象4.0(面對對象三大特征之--繼承)
class A(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age
a=A('Jack',15)
print(a)
#輸出結果:<__main__.A object at 0x00000216806D0460>
           

繼承的相關用法

 1.繼承的定義與法則

定義

class Son(Father):

 法則

一般來說,子類可以繼承父類的屬性和方法,但是這些屬性和方法都是公有的,不是私有化的,是以父類的私有化屬性和方法是繼承不了的

示例:

class Oldking(object):
    def __init__(self,name,clothes,seal,mausoleum):
        self.name=name
        self.clothes=clothes
        self.seal=seal
        self.__mausoleum=mausoleum#私有化屬性
    def dynasty(self):
        print('唐朝')
    def __years(self): #私有化方法
        print('貞觀之治')

class Newking(Oldking):
    pass

t=Newking('武則天','龍袍','玉玺','帝陵')
print(t.name,t.clothes,t.seal) #這裡無法輸出  帝陵,因為被父類私有化了
t.dynasty()  #同時也無法是以__years() 方法,這個方法也是私有化了
#輸出結果:武則天 龍袍 玉玺
#         唐朝
           

2.對繼承的重寫

        新皇帝可以繼承老皇帝的權利,那當然可以進行相關制度的改革,或者說是年号的改革,比如說唐太宗年号為貞觀之治,武則天的是貞觀遺風。是以我們在Python中子類也可以對父類繼承的東西進行重寫。
class Old(object):
    def __init__(self):
       self.king='隋炀帝'
       self.clothes='龍袍'
    def dynasty(self):
        print('這是隋朝')

class New(Old):
    def __init__(self):
        self.king='唐高祖'
        self.clothes=Old().clothes
    def dynasty(self):
        print('這是唐朝')
t=New()
print(t.king,t.clothes)
t.dynasty()
#輸出結果:唐高祖 龍袍
#         這是唐朝
           
這個示例可以看出,重寫了朝代和皇帝的名字,然而對龍袍進行了保留繼承

 3.(單繼承)多層繼承

        多層繼承就涉及到父類繼承其父類,子類又繼承父類,就是一種繼承的嵌套,也就是孫子繼承父親的,父親繼承爺爺的。當然在每次繼承的過程中也是可以對相關内容進行重寫。在繼承過程中,屬性的查找順序是先從自身屬性去查找,如果找不到就去父類去查找,如果父類還找不到就去爺爺類查找,以此類推……

        順序:對象>子類>父類>父父類

示例:

class Grandpa(object):
    def __init__(self):
        self.__name='史蒂夫'
        self.money=100
    def fun(self):
        print('傳家寶:尚方寶劍')
class Father(Grandpa):
    def __init__(self):
        self.money=2**10
class Son(Father):
    def college(self):
        print('GUET')
AJ=Son()
print(AJ.money)
AJ.fun()
AJ.college()
#輸出結果:
# 1024
# 傳家寶:尚方寶劍
# GUET
           

這個也是很好了解的,如果父類沒有特定設定私有化屬性的話,子類會一一繼承,如果一直嵌套下去的話,到最後子類具有的屬性和特點會非常多,這就是一個累積過程。當我們去建立一個執行個體對象,然後去查找這個執行個體對象相關屬性和方法時,這會依次向父類查找,直到找到為止。

4.多繼承

        多繼承是表示一個子類具繼承個父類,也就是說一個兒子有多個父親(到處認爹) 一個子類繼承多個父類的東西。
繼承順序:在繼承中出現相同方法則繼承順序是從左到右

示例1: 

class Father0(object):
    def fun(self):
        print('有錢')
class Father1(object):
    def fun(self):
        print('窮')
class Son0(Father0,Father1):
    pass
class Son1(Father1,Father0):
    pass
Jack=Son0()
jb=Son1() #輸出結果:有錢
Jack.fun()
jb.fun() #輸出結果:窮
           
在多繼承中,我們可以去通過__mro__方法去檢視繼承的屬性,(從左到右)

示例2: 

class G:
    pass
class E(G):
    pass
class F(G):
    pass
class B(E):
    pass
class C(F):
    pass
class D(G):
    pass
class A(B, C, D):
    pass
son=A()
print(A.__mro__) #檢視相同的方法繼承順序
           

輸出結果:

Python進階-----面對對象4.0(面對對象三大特征之--繼承)

順序為:A->B->E->G->C->F->D->object

Python進階-----面對對象4.0(面對對象三大特征之--繼承)

 5.多繼承重寫時調用父類方法

 一

在重寫多/但繼承父類的方法時,但是又想調用父類的方法,這時候就用到super() 方法
 super() 方法是按照上面所說的繼承順序來執行的,也就是執行第一個繼承的父類的方法
class Sheep(object):
    def sound(self):
        print('咩咩咩')
class Cat(object):
    def sound(self):
        print('喵喵喵')
    def animal(self):
        print('貓咪')
class Dog(Sheep):
    def animal(self):
        print('小狗')
class A(Dog,Cat):
    def sound(self):
        print('哈哈哈')
        super().sound() #調用(按照順序)父類的方法
tt=A()
tt.sound()
#輸出結果:哈哈哈
#        咩咩咩
           

可能會有些人疑惑,明明Dog沒有定義sound() 方法,但是又為什麼可以找到呢,其實是Dog繼承了Sheep類,是在這裡找到了sound() 方法

其實如果我們想去直到調用哪一個父類的方法,我們可以直接去聲明調用:

父類.方法(self)

class Cat(object):
    def sound(self):
        print('喵喵喵')
    def animal(self):
        print('貓咪')
class Dog(object):
    def animal(self):
        print('小狗')
class A(Dog,Cat):
    def sound(self):
        Cat.sound(self)####
        print('哈哈哈')
tt=A()
tt.sound()
print(A.__bases__)
#輸出結果:喵喵喵
#        哈哈哈
           

好了,這一期就到這裡了先,我們下一期再見~~~

分享一張壁

Python進階-----面對對象4.0(面對對象三大特征之--繼承)