官术网_书友最值得收藏!

6.7 類的繼承

所謂類的繼承(inheritance),就是新類繼承舊類的屬性與方法,這種行為稱為派生子類(subclassing)。繼承的新類稱為派生類(derived class),被繼承的舊類則稱為基類(base class)。當用戶創建派生類后,就可以在派生類內新增或是改寫基類的任何方法。

派生類的語法如下:

        class <類名稱> [(基類1,基類2, ...)]:
          ["文件字符串"]
        <語句>

一個派生類可以同時繼承自許多個基類,基類之間以逗號(,)隔開。

下列是一個基類A與一個基類B:

        >>> class A:
            pass

        >>> class B:
            pass

下列是一個派生類C,繼承自一個基類A:

        >>> class C(A):
            pass

下列是一個派生類D,繼承自兩個基類A與B:

        >>> class D(A, B):
            pass

1.派生類的構造方法

下列是一個基類的定義:

        >>>class Student:
            def __init__(self, name, sex, phone):
                  self.name = name
                  self.sex = sex
                  self.phone = phone
            def printData(self):
                  print ("姓名: ", self.name)
                  print ("性別: ", self.sex)
                  print ("電話: ", self.phone)

這個基類Student有3個成員變量:name(姓名)、sex(性別)和phone(電話)。并且定義兩個函數:①__init__()函數是Student類的構造方法。②printData()函數用來打印成員變量的數據。下面創建一個Student類的派生類:

        >>>class Person(Student):
        def __init__(self, name, sex, phone):       #派生類的構造方法
        Student.__init__(self, name, sex, phone)    #調用基類的構造方法

派生類的構造方法必須調用基類的構造方法,而且必須使用完整的基類名稱。Student.__init__(self, name, sex, phone)中的self參數,用來告訴基類現在調用的是哪一個派生類。

下列案例創建一個派生類Person的實例變量,并且調用基類Student的函數printData(),來印出數據。

        >>>x = Person("李明峰", "男", "12345678")
        >>>x.printData()
        姓名:  李明峰
        性別:  男
        電話:  12345678

2.命名空間的搜索順序

當用戶在類內編寫函數時,要記得類函數的命名空間的搜索順序。

(1)類的實例。

(2)類。

(3)基類。

下列是3個類:A、B和C。B繼承自A, C又繼承自B。A、B、C這3個類都有一個相同名稱的函數printName()。代碼如下:

        >>> class A:
          def __init__(self, name):
                  self.name = name
            def printName(self):
                  print ("這是類A的printName()函數,name = %s" % self.name)

        >>>class B(A):
          def __init__(self, name):
                A.__init__(self, name)
            def printName(self):
                    print ("這是類B的printName()函數,name = %s" % self.name)

        >>> class C(B):
            def __init__(self, name):
                  B.__init__(self, name)
            def printName(self):
                  print ("這是類C的printName()函數,name = %s" % self.name)

下面分別創建A、B、C這3個類的實例,并且調用printName()函數。代碼如下:

        >>> A("張曉曉").printName()
        這是類A的printName()函數,name = 張曉曉
        >>> B("胡明月").printName()
        這是類B的printName()函數,name = 胡明月
        >>> C("張一諾").printName()
            這是類C的printName()函數,name = 張一諾

上述代碼分析如下。

(1)A("張曉曉").printName()會調用A類的printName()函數。

(2)B("胡明月").printName()會先調用B類的printName()函數,因為已經找到一個printName()函數,所以不會繼續往A類查找。

(3)C("張一諾").printName()會先調用C類的printName()函數,因為已經找到一個printName()函數,所以不會繼續往B類與A類查找。

3.類的多繼承

Python同樣有限的支持多繼承形式。

【案例6-2】類的多繼承(代碼6.2.py)。

        #類定義
        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說:我 %d歲。" %(self.name, self.age))

        #單繼承示例
        class student(people):
            grade = ''
            def __init__(self, n, a, w, g):
              #調用父類的構函
              people.__init__(self, n, a, w)
              self.grade = g
            #覆寫父類的方法
            def speak(self):
              print("%s說:我 %d歲了,我在讀 %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("我叫 %s,我是一名人民教師,我演講的主題是 %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 = sample("張明明",25,80,4, "什么是愛")
        test.speak()   #方法名同,默認調用的是在括號中靠前的父類的方法

保存并運行程序,結果如下:

        C:\Users\Administrator>python d:\python\ch06\6.2.py
        我叫 張明明,我是一名人民教師,我演講的主題是 什么是愛

在本案例中,定義了一個people類,定義一個student類繼承自people類,實現單繼承效果。為了實現多繼承效果,這里又定義了一個speaker類,然后定義sample類繼承自speaker類和student類。

主站蜘蛛池模板: 德兴市| 扎赉特旗| 青岛市| 故城县| 灵寿县| 广河县| 黎川县| 嘉荫县| 琼结县| 防城港市| 新干县| 渭南市| 翁牛特旗| 巴林左旗| 阜新| 汉沽区| 大田县| 乌什县| 济源市| 化州市| 枣庄市| 乡城县| 武安市| 白城市| 南靖县| 乐昌市| 奉化市| 错那县| 罗城| 三穗县| 金阳县| 赤壁市| 尉犁县| 宣城市| 财经| 普宁市| 武陟县| 枣阳市| 出国| 杭锦后旗| 德格县|