繼承 繼承描述了基類的屬性如何“遺傳”給派生類。一個(gè)子類可以繼承它的基類的任何屬性,不管是數(shù)據(jù)屬性還是方法。 復(fù)制代碼 代碼如下: class SubClassName (ParentClass1[, ParentClass2, ...]): 'optional class documentation string' class_suite 實(shí)例 復(fù)制代碼 代碼如下: class Parent(object): # define parent class 定義父類 def parentMethod(self): print 'calling parent method' class Child(Parent): # define child class 定義子類 繼承與覆蓋 繼承 不同于Java,python的子類繼承父類后,會把父類的所有的方法,包括構(gòu)造器init()也繼承下來. 復(fù)制代碼 代碼如下: class Parent(): def __init__(self): print "init Parent class instance" def func(self): class Child(Parent): child = Child() 輸出 復(fù)制代碼 代碼如下: init Child class instance call parent func super關(guān)鍵字 super 是用來解決多重繼承問題的,直接用類名調(diào)用父類方法在使用單繼承的時(shí)候沒問題,但是如果使用多繼承,會涉及到查找順序(MRO)、重復(fù)調(diào)用(鉆石繼承)等種種問題。語法如下 復(fù)制代碼 代碼如下: super(type[, obj]) 示例 復(fù)制代碼 代碼如下: class C(B): def method(self, arg): super(C, self).method(arg) 注意 super繼承只能用于新式類,用于經(jīng)典類時(shí)就會報(bào)錯(cuò)。 復(fù)制代碼 代碼如下: class Parent(object): def __init__(self): self.phone = '123456' self.address = 'abcd' class Child(Parent): def main(): if __name__ == '__main__': 輸出 復(fù)制代碼 代碼如下: phone is: 123456 address is: abcd data is: 100 重寫 子類只要重新定義一個(gè)與父類的方法同名的方法,就可以重寫覆蓋父類的方法. 子類只要把上例父類的func(self)重寫就行了. 復(fù)制代碼 代碼如下: class Parent(): def __init__(self): print "init Parent class instance" def func(self): print "call parent func" class Child(Parent): def __init__(self): print "init Child class instance" child = Child() 輸出 復(fù)制代碼 代碼如下: init Child class instance call Child func 多重繼承 同 C++一樣,Python 允許子類繼承多個(gè)基類。但一般不推薦用多重繼承.語法如下: 復(fù)制代碼 代碼如下: class Father(): def __init__(self): print "init Father instance" class Mother(): class Child(Father, Mother): 類、實(shí)例和其他對象的內(nèi)建函數(shù) issubclass() 布爾函數(shù)判斷一個(gè)類是另一個(gè)類的子類或子孫類。它有如下語法: 復(fù)制代碼 代碼如下: issubclass(sub, sup) isinstance() 布爾函數(shù)在判定一個(gè)對象是否是另一個(gè)給定類的實(shí)例時(shí),非常有用。它有如下語法: 復(fù)制代碼 代碼如下: isinstance(obj1, obj2) attr()系列函數(shù) ●hasattr() ●delattr() 實(shí)例 復(fù)制代碼 代碼如下: class Child(Parent): def __init__(self): self.data = 100 child = Child() print "delete attr" print "has data attr?", hasattr(child, 'data') print "set data attr to 200" 輸出 復(fù)制代碼 代碼如下: has data attr? True delete attr has data attr? False set data attr to 200 data attr is: 200 私有化 Python沒有像Java那樣實(shí)現(xiàn)真正的封裝,只是用雙劃線和單劃線實(shí)現(xiàn)私有化. ●雙劃線 復(fù)制代碼 代碼如下: def __func(self): print "call" ●單劃線 防止模塊的屬性用“from mymodule import *”來加載。 |
|