- 論壇徽章:
- 0
|
單繼承
具體的語法就不說了。我很關(guān)心的是它到底繼承了什么
單繼承條件下很簡單。類的靜態(tài)變量、類的靜態(tài)方法、實例的方法、實例的成員變量、基類的構(gòu)造函數(shù)、基類的析構(gòu)函數(shù)都可以從父類中繼承過來。私有方法和私有變量是不能繼承的。具體看測試代碼:
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
多繼承
多繼承下,情況明顯比這復(fù)雜而且,而且會產(chǎn)生多個基類覆蓋函數(shù)的問題。很幸運(yùn),C#中已經(jīng)沒有了多繼承,你只能從多個接口繼承。正因為這樣,我感覺這種多繼承應(yīng)該一般不需要用,否則代碼會很晦澀。下面這個例子你就可以看到。在上面的例子中,我多添加了一個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
現(xiàn)在這個例子是可以通過的,但如果你把
class MiniStudent(Student,StudentA)
修改成
class MiniStudent(StudentA,Student)
這個代碼就通不過了。告訴你mini.addr沒有定義。
其實是StudentA的構(gòu)造函數(shù)覆寫了Student的函數(shù),也就是說只調(diào)用了StudentA.__init__()的方法。下面就談到繼承中的覆寫問題。
繼承中的覆寫
從上面的經(jīng)驗可以得到
Python的多繼承,但有以下幾點需要注意:
1. 繼承方法的調(diào)用和基類聲明順序有關(guān)(最先使用的覆寫之后的方法)。
2. 基類init、del ,如果希望都使用,請顯示的調(diào)用,否則很容易出錯。
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() |
|