簡明Python教程 --- 11.物件導向
在本章之前,所有對Python的介紹都是關於語句塊和函數的。這叫做面向過程編程。
本章,就要開始介紹Python中的物件導向編程的知識。在Python中,類和對象是物件導向編程的兩個主要方面。類建立了一個新類型,而對象是這個類的執行個體。
類是一個獨立的結構,它的內部包含欄位和方法。欄位是指類內部的變數,而方法是指類內部的函數。這些欄位和方法存在於類內部,是類的成員。
類用class關鍵字建立,類的欄位和方法被列在緊跟其後的縮排塊中。
建立一個類
class Person :
name=u'名字';
def printName(self) :
print self.name;
p = Person();
p.printName();
注意,self是指對當前執行個體的引用,這和C++中的self指標或Java、C#中的this引用。另外,類的方法的第一個參數必須是self,即使你的方法沒有參數,你還是要添加一個self,如上面的例子。
但是,調用類的方法的時候,不需要將self顯式地寫出來,如上例。
__init__方法
在Python中,類的某些方法是有特殊作用的。
__init__方法就是其中之一,它會在建立類的執行個體的時候被自動調用,來完成一些初始化的操作。
可以看到,__init__方法和C++、Java、C#中的構造方法是類似的。
class Person :
def __init__(self, name) :
self.name = name;
def printName(self) :
print self.name;
p = Person(u'名字2');
p.printName();
類的成員、對象的成員
這裡只舉一個例子來說明類的成員與對象的成員的區別。
class Person :
count = 0;
def __init__(self, name) :
print '__init__';
self.name = name;
Person.count += 1;
def __del__(self) :
print '__del__';
Person.count -= 1;
def printCount(self) :
print self.name, ":", Person.count;
p1 = Person("p1Name");
p1.printCount();
p2 = Person("p2Name");
p2.printCount();
p3 = Person("p3Name");
p3.printCount();
在上例中,name是對象的成員,而count是類的成員。
注意,和Java這類語言不通,Python中沒有private、protected這種存取範圍限定符,在Python中類的所有成員都是公有的。但是還是有一種例外情況的,就是Python會自動把以雙底線開頭的成員作為私人成員。
另外,上面你所看到的__del__方法類似於C++中的析構方法,或Java中的finalize方法。在對象應該被垃圾收集的時候,該方法會被自動調用來完成最後的一些清理工作。
繼承
class Person :
def __init__(self, name) :
self.name = name;
def printSelf(self) :
print "name is ", self.name;
class Student(Person) :
def __init__(self, name) :
Person.__init__(self, name);
self.type = 'student';
def printSelf(self) :
Person.printSelf(self);
print "type is ", self.type;
s = Student('Tom');
s.printSelf();
上面的例子中,Student類繼承了Person類。注意上面的代碼的這一行:
class Student(Person) :
其中,(Person)是一個元組,前面介紹過元組這種資料結構。如果這個元組中有一個以上的類,則叫做多重繼承。