Python學習之單繼承與多繼承

  1. 繼承

面向對象編程語言的一個主要功能就是「繼承」。python

繼承是指這樣一種能力:它可使用現有類的全部功能,並在無需從新編寫原來的類的狀況下對這些功能進行擴展。程序員

(1) 單繼承python同時支持類的繼承。若是一種語言不支持繼承,類就沒什麼意義。編程

類還容許派生,即用戶能夠建立一個子類,它也是類,並且繼承父類(即基類)的全部特徵和屬性。編程語言

建立派生類的語法格式爲:函數

class DerivedClassName(BaseClassName):spa

    <statement-1>對象

    ...繼承

    <statement-N>遞歸

基類名BaseClassName必須與派生類定義在一個做用域內。除了用類名,還能夠用表達式。作用域

例如:單繼承舉例:

class people:

#定義基本屬性

    name=''    

age=0

#定義私有屬性,私有屬性在類外部沒法直接進行訪問

__weight=0

#定義構造方法

    def __init__(self,n,a,w):

        self.name=n

        self.age=a

        self.__weight=w

    def speak(self):

        print("%s says:I am %d years old"%(self.name,self.age))

#單繼承

class student(people):

grade=''

#調用父類的構造函數

    def __init__(self,n,a,w,g):

        people.__init__(self,n,a,w)   #student繼承並使用people的__init__函數

        self.grade=g                   #不一樣於people的參數g

#重寫父類的方法

def speak(self):

#顯示student的信息

        print("%s says:I am %d years old,I am in Grade %d."%(self.name,self.age,self.grade))

s=student('Tom',10,90,3)        #實例化student類

s.speak()                        #顯示student的speak方法

#運行結果:Tom says:I am 10 years old,I am in Grade 3.

 

 

(2) 多繼承:某個類繼承了多個父類

多繼承的類定義語法格式以下:

class DerivedClassName(Base1,Base2,Base3):

    <statement-1>

    ...

<statament-N>

#注意解析類屬性的規則是,順序是深度優先,從左到右。所以,若是在DerivedClassName(示例中的派生類)中沒有找到這個屬性,就會搜索Base1,而後遞歸的搜索其基類,若是最終沒有找到,就搜索Base2,依次類推。深度優先不區分屬性繼承自基類仍是直接定義。

例如:class people:

#定義基本屬性

    name=''    

    age=0

    __weight=0

#定義構造方法

    def __init__(self,n,a,w):

        self.name=n

        self.age=a

        self.__weight=w

    def speak(self):

        print("%s says:I am %d years old"%(self.name,self.age))

#單繼承

class student(people):

    grade=''

#調用父類的構造函數

    def __init__(self,n,a,w,g):

        people.__init__(self,n,a,w)   #student繼承並使用people的__init__函數

        self.grade=g

        def speak(self):

        print("%s says:I am %d years old,I am in Grade %d."%(self.name,self.age,self.grade))

class speaker():

    topic=''

    name=''

    def __init__(self,n,t):

        self.name=n

        self.topic=t

    def speak(self):

        print("I am %s,I am a speaker,my topic is %s"%(self.name,self.topic))

        

class sample(speaker,student):

    a=''

    def __init__(self,n,a,w,g,t):

        student.__init__(self,n,a,w,g)

        speaker.__init__(self,n,t)

test_1=sample("Tom",12,90,3,"One World One Dream")

test_1.speak()

#執行結果:I am Tom,I am a speaker,my topic is one World One Dream.

(3) 補充

1.方法重寫

若是父類方法的功能不能知足需求,能夠在子類裏重寫父類的方法。

例如:

class Parent:               #定義父類

    def myMethod(self):

        print('調用父類方法')

class Child(Parent):          #定義子類

    def myMethod(self):

        print('調用子類方法')

Child_1=Child()                     #子類實例

Child_1.myMethod()                      #子類調用重寫方法

輸出:調用子類方法

2. if__name__=’__main__’的做用

這條語句的意思是,讓程序員寫的腳本模塊既能夠導入到別的模塊中調用,也能夠在模塊中本身執行。

例如 #y1htext.py

def main():

    print('hello world,I am in %s now.' %__name__)

if __name__=='__main__':

main()                      運行結果:hello world,I am in __main__now.

在這個文件中定義了一個main()函數,若是執行該.py文件,則if語句中的內容被執行,成功調用main()函數。

從另外一個模塊導入該模塊,這個模塊的名字是test1.py

#test1.py

from y1htext import main

mian()         #相同的運行結果

3. 運算符重載:用於新類的運算符的實現。

運算符重載是針對新類型數據的實際須要,對原有運算符進行適當的改造,通常來講,重載的功能應當與原有功能相相似,不能改變原運算符的操做對象個數,同時至少要有一個操做對象是自定義類型。

Python支持運算符重載,它的運算符重載就是經過重寫這些python內建方法來實現的。這些內建方法都是以雙下劃線開頭和結尾的,Python經過這種特殊的命名方式來攔截操做符,以實現重載。

例如:+用__add__方法,+=用__iadd__方法,...,*用__mul__方法等

Python的內置操做運用於類對象時,Python會去搜索並調用對象中指定的方法來完成操做。運算符重載是經過建立運算符函數實現的,運算符重載實際是一個函數,因此運算符的重載其實是函數的重載。

例如:運算符重載

class Computation():

    def __init__(self,value):

        self.value=value

    def __add__(self,other):

        return(self.value+other.value)

    def __sub__(self,other):

        return(self.value-other.value)

c1=Computation(10)

c2=Computation(10)

print(c1+c2)

print(c1-c2)  #「-」在做用於類對象,實現減法運算符的重載

說明:若是類實現了__add__的方法,當類的對象出如今「+」運算符中時,會調用這個方法;若是類實現了__sub__方法,當類的對象出如今「-」運算符中時,會調用這個方法。重載這兩個方法就是能夠在普通的類對象上添加「+」和「-」運算。

 

 

(4) isinstance函數(Python語言的一個內建函數)

語法:isinstance(object,type) 函數是Python語言的一個內建函數

做用是:判斷一個對象或者變量是不是一個已知的類型。

 針對類來講若是參數是object是type類的實例(判斷一個對象是否爲該類的實例)或者object是type類的子類的一個實例,則返回True.若是object不是一個給定類型的對象,則返回結果是False.

class objA:

    pass

class objB(objA):

    pass

A=objA()

B=objB()

print(isinstance(A,objA))

print(isinstance(B,objA))

print(isinstance(A,objB))           

print(isinstance(B,objB))

② 針對變量來講,第一個參數(object)爲變量,第二個參數(type)爲類型名或者由變量名組成的一個元組(如(int,list,float)),其返回值爲布爾型(Ture或False).若第一個參數爲一個元組,則變量類型與元組類型名之一相同時即返回True.

a=2

print(isinstance(a,int))

print(isinstance(a,str))

print(isinstance(a,(str,int,list)))

(5) super()函數

當存在繼承關係的時候,有時候須要在子類中調用父類的方法。若是修改父類名稱,那麼在子類中會涉及多處修改。

Python引入了super()機制,語法格式以下:

super(type[,object-or-type])

例如:

class A(object):

    def __init__(self):

        print('enter A')

        print('leave A')

class BA.:    #B繼承A

    def __init__(self):

        print("enter B")

        super(B,self).__init__()   #python2對其理解爲:super(B,self)首先找到B的父類(就是類A),而後把類B的對象self轉換爲類A的對象,而後被轉換的類A對象調用本身的__init__函數。Python3.x能夠不加參數而直接寫爲super().__init__,而且能夠像父類中的屬性賦值。

        print("leave B")

b=B()

相關文章
相關標籤/搜索