單繼承
具體的文法就不說了。我很關心的是它到底繼承了什麼
單繼承條件下很簡單。類的靜態變數、類的靜態方法、執行個體的方法、執行個體的成員變數、基類的建構函式、基類的解構函式都可以從父類中繼承過來。私人方法和私人變數是不能繼承的。具體看測試代碼:
class Student:
'''this test class'''
name = 'ss'
age = 13
def __init__(self):
self.name='bb'
self.addr="shanghai"
self.__love="man"
print "init..."
def __del__(self):
print "dead..."
def Run(self):
print 'people Run'
@staticmethod
def RunStatic():
print "In Static method..."
def __Good(self):
print "good"
class MiniStudent(Student):
pass
#類
print MiniStudent.name
print MiniStudent.age
print MiniStudent.RunStatic()
print "----================--------"
#執行個體
mini = MiniStudent()
print mini.name
print mini.age
print mini.Run()
print mini.addr
多繼承
多繼承下,情況明顯比這複雜而且,而且會產生多個基類覆蓋函數的問題。很幸運,C#中已經沒有了多繼承,你只能從多個介面繼承。正因為這樣,我感覺這種多繼承不應該被濫用,否則代碼會很晦澀。下面這個例子你就可以看到。在上面的例子中,我多添加了一個StudentA的類。 具體看測試代碼:
class StudentA:
def __init__(self):
print 'init-studenta'
def GoCar(self):
print "Go Car"
class Student:
'''this test class'''
name = 'ss'
age = 13
def __init__(self):
self.name='bb'
self.addr="shanghai"
self.__love="man"
print "init..."
def __del__(self):
print "dead..."
def Run(self):
print 'people Run'
@staticmethod
def RunStatic():
print "In Static method..."
def __Good(self):
print "good"
class MiniStudent(Student,StudentA):
pass
#類
mini = MiniStudent()
print mini.name
print mini.age
print mini.Run()
print mini.addr
現在這個例子是可以通過的,但如果你把
class MiniStudent(Student,StudentA)
修改成
class MiniStudent(StudentA,Student)
這個代碼就通不過了。告訴你mini.addr沒有定義。
其實是StudentA的建構函式覆寫了Student的函數,也就是說只調用了StudentA.__init__()的方法。下面就談到繼承中的覆寫問題。
繼承中的覆寫
從上面的經驗可以得到
Python的多繼承,但有以下幾點需要注意:
1. 繼承方法的調用和基類聲明順序有關(最先使用的覆寫之後的方法)。
2. 基類__init__()、__del__() ,如果希望都使用,請顯示的調用,否則很容易出錯。
class StudentA:
def __init__(self):
print 'init-b'
class Student:
def __init__(self):
print 'init-a'
class MiniStudent(Student,StudentA):
def __init__(self):
StudentA.__init__(self)
Student.__init__(self)
#執行個體
mini = MiniStudent()