1. 程式人生 > >python類:面向物件、繼承、slot、多重繼承

python類:面向物件、繼承、slot、多重繼承

python面向物件基礎知識

面向物件的三大特性:封裝、繼承和多型。

繼承

在Python中,同時支援單繼承與多繼承,一般語法如下:
class SubClassName(ParentClass1 [, ParentClass2, ...]):

    class_suite

繼承示例1

class Parent(object):
    x = 1
class Child1(Parent):
    pass
class Child2(Parent):
    pass
 
print Parent.x, Child1.x, Child2.x
Child1.x = 2
print Parent.x, Child1.x, Child2.x
Parent.x = 3
print Parent.x, Child1.x, Child2.x
 
以上程式碼的輸出是:
1 1 1
1 2 1
3 2 3
最後一行的輸出是 3 2 3 而不是 3 2 1。為什麼改變了 Parent.x 的值還會改變 Child2.x 的值,但是同時 Child1.x 值卻沒有改變?這個答案的關鍵是,在 Python 中,類變數在內部是作為字典處理的。如果一個變數的名字沒有在當前類的字典中發現,將搜尋祖先類(比如父類)直到被引用的變數名被找到(如果這個被引用的變數名既沒有在自己所在的類又沒有在祖先類中找到,會引發一個 AttributeError 異常 )。

繼承示例2

如果繼承一個函式,而想重寫,但是重寫的函式中想要引用不重寫時函式的值,可以這樣

def get_params(self, deep=True):
params = super(DNN, self).get_params()

內建函式insubclass()

實現繼承之後,子類將繼承父類的屬性,也可以使用內建函式insubclass()來判斷一個類是不是另一個類的子孫類:

Python
123456789101112131415161718192021222324252627classParent(object):'''    parent class    '''numList=[]defnumAdd
(self,a,b):returna+bclassChild(Parent):passc=Child()# subclass will inherit attributes from parent class    Child.numList.extend(range(10))printChild.numListprint"2 + 5 =",c.numAdd(2,5)# built-in function issubclass()print issubclass(Child,Parent)print issubclass(Child,object)# __bases__ can show all the parent classes
printChild.__bases__# doc string will not be inheritedprintParent.__doc__printChild.__doc__

文件字串__doc__屬性

文件字串對於類,函式/方法,以及模組來說是唯一的,也就是說__doc__屬性是不能從父類中繼承來的。

繼承中的__init__

1. 如果子類沒有定義自己的初始化函式,父類的初始化函式會被預設呼叫;但是如果要例項化子類的物件,則只能傳入父類的初始化函式對應的引數,否則會出錯。

Python
123456789101112classParent(object):def__init__(self,data):self.data=dataprint"create an instance of:",self.__class__.__name__print"data attribute is:",self.dataclassChild(Parent):passc=Child("init Child")printc=Child()  #出錯

2. 如果子類定義了自己的初始化函式,而沒有顯示呼叫父類的初始化函式,則父類的屬性不會被初始化

Python
123456789101112classParent(object):def__init__(self,data):self.data=dataprint"create an instance of:",self.__class__.__name__print"data attribute is:",self.dataclassChild(Parent):def__init__(self):print"call __init__ from Child class"c=Child()print c.data

3. 如果子類定義了自己的初始化函式,顯示呼叫父類,子類和父類的屬性都會被初始化

Python
12345678910111213classParent(object):def__init__(self,data):self.data=dataprint"create an instance of:",self.__class__.__name__print"data attribute is:",self.dataclassChild(Parent):def__init__(self):print"call __init__ from Child class"super(Child,self