【Python】python類的繼承

CS青雀發表於2018-12-04

目錄

 

回到頂部

一、概述 

  物件導向程式設計 (OOP) 語言的一個主要功能就是“繼承”。繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴充套件。

  通過繼承建立的新類稱為“子類”或“派生類”,被繼承的類稱為“基類”、“父類”或“超類”,繼承的過程,就是從一般到特殊的過程。在某些 OOP 語言中,一個子類可以繼承多個基類。但是一般情況下,一個子類只能有一個基類,要實現多重繼承,可以通過多級繼承來實現。

  繼承概念的實現方式主要有2類:實現繼承、介面繼承。

  1. 實現繼承是指使用基類的屬性和方法而無需額外編碼的能力。
  2. 介面繼承是指僅使用屬性和方法的名稱、但是子類必須提供實現的能力(子類重構爹類方法)。

  在考慮使用繼承時,有一點需要注意,那就是兩個類之間的關係應該是“屬於”關係。例如,Employee 是一個人,Manager 也是一個人,因此這兩個類都可以繼承 Person 類。但是 Leg 類卻不能繼承 Person 類,因為腿並不是一個人。

  OO開發正規化大致為:劃分物件→抽象類→將類組織成為層次化結構(繼承和合成) →用類與例項進行設計和實現幾個階段。

 

回到頂部

二、類的繼承

2.1 繼承的定義

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

class Person(object):   # 定義一個父類

 

    def talk(self):    # 父類中的方法

        print("person is talking....")  

 

 

class Chinese(Person):    # 定義一個子類, 繼承Person類

 

    def walk(self):      # 在子類中定義其自身的方法

        print('is walking...')

 

= Chinese()

c.talk()      # 呼叫繼承的Person類的方法

c.walk()     # 呼叫本身的方法

 

# 輸出

 

person is talking....

is walking...

 

2.2 建構函式的繼承 

   如果我們要給例項 c 傳參,我們就要使用到建構函式,那麼建構函式該如何繼承,同時子類中又如何定義自己的屬性?

繼承類的構造方法:

        1.經典類的寫法: 父類名稱.__init__(self,引數1,引數2,...)

        2. 新式類的寫法:super(子類,self).__init__(引數1,引數2,....)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

class Person(object):

 

    def __init__(self, name, age):

        self.name = name

        self.age = age

        self.weight = 'weight'

 

    def talk(self):

        print("person is talking....")

 

 

class Chinese(Person):

 

    def __init__(self, name, age, language):  # 先繼承,在重構

        Person.__init__(self, name, age)  #繼承父類的構造方法,也可以寫成:super(Chinese,self).__init__(name,age)

        self.language = language    # 定義類的本身屬性

 

    def walk(self):

        print('is walking...')

 

 

class American(Person):

    pass

 

= Chinese('bigberg'22'Chinese')

  如果我們只是簡單的在子類Chinese中定義一個建構函式,其實就是在重構。這樣子類就不能繼承父類的屬性了。所以我們在定義子類的建構函式時,要先繼承再構造,這樣我們也能獲取父類的屬性了。

      子類建構函式基礎父類建構函式過程如下:

      例項化物件c ----> c 呼叫子類__init__()  ---- > 子類__init__()繼承父類__init__()  ----- > 呼叫父類 __init__()

      

 

2.3 子類對父類方法的重寫

  如果我們對基類/父類的方法需要修改,可以在子類中重構該方法。如下的talk()方法 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

class Person(object):

 

    def __init__(self, name, age):

        self.name = name

        self.age = age

        self.weight = 'weight'

 

    def talk(self):

        print("person is talking....")

 

class Chinese(Person):

 

    def __init__(self, name, age, language): 

        Person.__init__(self, name, age) 

        self.language = language

        print(self.name, self.age, self.weight, self.language)

 

    def talk(self):  # 子類 重構方法

        print('%s is speaking chinese' % self.name)

 

    def walk(self):

        print('is walking...')

 

= Chinese('bigberg'22'Chinese')

c.talk()

 

# 輸出

bigberg 22 weight Chinese

bigberg is speaking chinese

 https://www.cnblogs.com/bigberg/p/7182741.html

相關文章