- Python程序設計案例課堂
- 劉春茂
- 1372字
- 2020-11-28 15:11:33
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類。
- Dynamics 365 for Finance and Operations Development Cookbook(Fourth Edition)
- Cocos2d Cross-Platform Game Development Cookbook(Second Edition)
- Java多線程編程實戰指南:設計模式篇(第2版)
- Java程序設計與開發
- WebAssembly實戰
- AngularJS Web Application Development Blueprints
- Visual FoxPro 程序設計
- Ext JS Data-driven Application Design
- BeagleBone Media Center
- GitLab Repository Management
- Python編程完全入門教程
- Hands-On Natural Language Processing with Python
- 區塊鏈技術進階與實戰(第2版)
- Learning C++ by Creating Games with UE4
- Implementing Microsoft Dynamics NAV(Third Edition)