本文實(shí)例講述了Python面向?qū)ο?/a>類的繼承。分享給大家供大家參考,具體如下:
一、概述
面向?qū)ο缶幊?(OOP) 語(yǔ)言的一個(gè)主要功能就是“繼承”。繼承是指這樣一種能力:它可以使用現(xiàn)有類的所有功能,并在無(wú)需重新編寫原來(lái)的類的情況下對(duì)這些功能進(jìn)行擴(kuò)展。
通過繼承創(chuàng)建的新類稱為“子類”或“派生類”,被繼承的類稱為“基類”、“父類”或“超類”,繼承的過程,就是從一般到特殊的過程。在某些 OOP 語(yǔ)言中,一個(gè)子類可以繼承多個(gè)基類。但是一般情況下,一個(gè)子類只能有一個(gè)基類,要實(shí)現(xiàn)多重繼承,可以通過多級(jí)繼承來(lái)實(shí)現(xiàn)。
繼承概念的實(shí)現(xiàn)方式主要有2類:實(shí)現(xiàn)繼承、接口繼承。
實(shí)現(xiàn)繼承是指使用基類的屬性和方法而無(wú)需額外編碼的能力。
接口繼承是指僅使用屬性和方法的名稱、但是子類必須提供實(shí)現(xiàn)的能力(子類重構(gòu)爹類方法)。
在考慮使用繼承時(shí),有一點(diǎn)需要注意,那就是兩個(gè)類之間的關(guān)系應(yīng)該是“屬于”關(guān)系。例如,Employee 是一個(gè)人,Manager 也是一個(gè)人,因此這兩個(gè)類都可以繼承 Person 類。但是 Leg 類卻不能繼承 Person 類,因?yàn)橥炔⒉皇且粋€(gè)人。
OO開發(fā)范式大致為:劃分對(duì)象→抽象類→將類組織成為層次化結(jié)構(gòu)(繼承和合成) →用類與實(shí)例進(jìn)行設(shè)計(jì)和實(shí)現(xiàn)幾個(gè)階段。
二、類的繼承
2.1 繼承的定義
1
2
3
4
5
6
7
8
9
|
class Person( object ): # 定義一個(gè)父類 def talk( self ): # 父類中的方法 print ( "person is talking...." ) class Chinese(Person): # 定義一個(gè)子類, 繼承Person類 def walk( self ): # 在子類中定義其自身的方法 print ( 'is walking...' ) c = Chinese() c.talk() # 調(diào)用繼承的Person類的方法 c.walk() # 調(diào)用本身的方法 |
輸出:
person is talking....
is walking...
2.2 構(gòu)造函數(shù)的繼承
如果我們要給實(shí)例 c 傳參,我們就要使用到構(gòu)造函數(shù),那么構(gòu)造函數(shù)該如何繼承,同時(shí)子類中又如何定義自己的屬性?
繼承類的構(gòu)造方法:
1.經(jīng)典類的寫法: 父類名稱.__init__(self,參數(shù)1,參數(shù)2,...)
2. 新式類的寫法:super(子類,self).__init__(參數(shù)1,參數(shù)2,....)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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): # 先繼承,在重構(gòu) Person.__init__( self , name, age) #繼承父類的構(gòu)造方法,也可以寫成:super(Chinese,self).__init__(name,age) self .language = language # 定義類的本身屬性 def walk( self ): print ( 'is walking...' ) class American(Person): pass c = Chinese( 'bigberg' , 22 , 'Chinese' ) |
如果我們只是簡(jiǎn)單的在子類Chinese中定義一個(gè)構(gòu)造函數(shù),其實(shí)就是在重構(gòu)。這樣子類就不能繼承父類的屬性了。所以我們?cè)诙x子類的構(gòu)造函數(shù)時(shí),要先繼承再構(gòu)造,這樣我們也能獲取父類的屬性了。
子類構(gòu)造函數(shù)基礎(chǔ)父類構(gòu)造函數(shù)過程如下:
實(shí)例化對(duì)象c ----> c 調(diào)用子類__init__() ---- > 子類__init__()繼承父類__init__() ----- > 調(diào)用父類 __init__()
2.3 子類對(duì)父類方法的重寫
如果我們對(duì)基類/父類的方法需要修改,可以在子類中重構(gòu)該方法。如下的talk()
方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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 ): # 子類 重構(gòu)方法 print ( '%s is speaking chinese' % self .name) def walk( self ): print ( 'is walking...' ) c = Chinese( 'bigberg' , 22 , 'Chinese' ) c.talk() |
輸出:
bigberg 22 weight Chinese
bigberg is speaking chinese
三、類繼承的事例
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
class SchoolMember( object ): '''學(xué)習(xí)成員基類''' member = 0 def __init__( self , name, age, sex): self .name = name self .age = age self .sex = sex self .enroll() def enroll( self ): '注冊(cè)' print ( 'just enrolled a new school member [%s].' % self .name) SchoolMember.member + = 1 def tell( self ): print ( '----%s----' % self .name) for k, v in self .__dict__.items(): print (k, v) print ( '----end-----' ) def __del__( self ): print ( '開除了[%s]' % self .name) SchoolMember.member - = 1 class Teacher(SchoolMember): '教師' def __init__( self , name, age, sex, salary, course): SchoolMember.__init__( self , name, age, sex) self .salary = salary self .course = course def teaching( self ): print ( 'Teacher [%s] is teaching [%s]' % ( self .name, self .course)) class Student(SchoolMember): '學(xué)生' def __init__( self , name, age, sex, course, tuition): SchoolMember.__init__( self , name, age, sex) self .course = course self .tuition = tuition self .amount = 0 def pay_tuition( self , amount): print ( 'student [%s] has just paied [%s]' % ( self .name, amount)) self .amount + = amount t1 = Teacher( 'Wusir' , 28 , 'M' , 3000 , 'python' ) t1.tell() s1 = Student( 'haitao' , 38 , 'M' , 'python' , 30000 ) s1.tell() s2 = Student( 'lichuang' , 12 , 'M' , 'python' , 11000 ) print (SchoolMember.member) del s2 print (SchoolMember.member) |
輸出:
----end-----
just enrolled a new school member [haitao].
----haitao----
age 38
sex M
name haitao
amount 0
course python
tuition 30000
----end-----
just enrolled a new school member [lichuang].
3
開除了[lichuang]
2
開除了[Wusir]
開除了[haitao]
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
原文鏈接:https://www.cnblogs.com/bigberg/p/7182741.html