繼承
繼承描述了基類的屬性如何“遺傳”給派生類。一個子類可以繼承它的基類的任何屬性,不管是數(shù)據(jù)屬性還是方法。
創(chuàng)建子類的語法看起來與普通(新式)類沒有區(qū)別,一個類名,后跟一個或多個需要從其中派生的父類:
class Child(Parent): # define child class 定義子類
def childMethod(self):
print 'calling child method'
繼承
不同于Java,python的子類繼承父類后,會把父類的所有的方法,包括構造器init()也繼承下來.
def func(self):
print "call parent func"
class Child(Parent):
def __init__(self):
print "init Child class instance"
child = Child()
child.func()
super 是用來解決多重繼承問題的,直接用類名調用父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查找順序(MRO)、重復調用(鉆石繼承)等種種問題。語法如下
super繼承只能用于新式類,用于經(jīng)典類時就會報錯。
新式類:必須有繼承的類,如果沒什么想繼承的,那就繼承object
經(jīng)典類:沒有父類,如果此時調用super就會出現(xiàn)錯誤:『super() argument 1 must be type, not classobj』
實例
class Child(Parent):
def __init__(self):
super(Child, self).__init__()
self.data = 100
def main():
child = Child()
print "phone is: ", child.phone
print "address is: ", child.address
print "data is: ", child.data
if __name__ == '__main__':
main()
子類只要重新定義一個與父類的方法同名的方法,就可以重寫覆蓋父類的方法. 子類只要把上例父類的func(self)重寫就行了.
child = Child()
child.func()
同 C++一樣,Python 允許子類繼承多個基類。但一般不推薦用多重繼承.語法如下:
class Mother():
def __init__(self):
print "init Mother instance"
class Child(Father, Mother):
pass
issubclass()
布爾函數(shù)判斷一個類是另一個類的子類或子孫類。它有如下語法:
布爾函數(shù)在判定一個對象是否是另一個給定類的實例時,非常有用。它有如下語法:
●hasattr()
它的目的就是為了決定一個對象是否有一個特定的屬性,一般用于訪問某屬性前先作一下檢查。
●getattr()和setattr()
●getattr()和 setattr()函數(shù)相應地取得和賦值給對象的屬性,
●delattr()
刪除特定的屬性
實例
child = Child()
print "has data attr?", hasattr(child, 'data')
print "delete attr"
delattr(child, 'data')
print "has data attr?", hasattr(child, 'data')
print "set data attr to 200"
setattr(child, 'data', 200)
print "data attr is: ", getattr(child, 'data')
私有化
Python沒有像Java那樣實現(xiàn)真正的封裝,只是用雙劃線和單劃線實現(xiàn)私有化.
●雙劃線
防止外部訪問.如在func前加雙劃線,可以防止包括子類的實例的訪問.