類
類的基本知識點記錄
1.舊式類和新式類
-python的新式類是在2.2引進的,之前的類叫做舊式類或者經典類。在2.2之前,類和類型是兩個不同的概念,引入新式類將兩者進行了統一(這句話我沒有看明白什麼意
思)。新式類的基類搜尋機制是廣度優先遍曆,而舊式類的基類搜尋機制是深度優先遍曆。預設情況下使用者定義的類為舊式類,如果需要定義新式類,有兩種方法:
#在定義新式類前,把下面這句話放到模組的最前面 __metaclass__ = type #直接或間接的繼承object類 class NewObject(object): def __init__(self): pass 2.self -在類定義的函數中,預設第一個參數應該是self,即這個類本身,每次調用函數時,函數自動將所在類作為參數傳入進去。除此之外,如果需要調用類中的屬性,也需要通過 self這個參數self'.屬性來進行調用。 -self參數正是方法和函數的區別。方法將第一個參數綁定到它所屬的執行個體上,因此這個參數可以不必由調用者顯示的傳入。 3.私人 -python不支援私人方式。但是可以用一些小技巧來避免外部直接可以訪問到這些屬性或者方法。 -為了讓方法或者特性變為私人(從外部無法訪問),在它的名字前加上雙底線即可:
class test: def __method1(self,x): print x 執行
>>> test = test() >>> test.__method1('a') Traceback (most recent call last): File "<pyshell#22>", line 1, in <module> test.__method1('a') AttributeError: test instance has no attribute '__method1' -原理,類的內部定義中,所有以雙底線開頭的名字都被“翻譯”成前面加上單底線和類名的形式。
>>> class Test: def __method1(self): print 'a' >>> test = Test() >>> test <__main__.Test instance at 0x0000000002AD7E08> >>> test._Test__method1() a >>> test.__method1() Traceback (most recent call last): File "<pyshell#32>", line 1, in <module> test.__method1() AttributeError: Test instance has no attribute '__method1' -除此之外,如果不需要這樣的方法但是又想讓其他對象不要訪問內部資料,可以使用單底線。前面帶有底線的名字都不會被帶星號的imports語句匯入
from module import * 4.超類 -在定義類的時候,類名後加括弧,括弧內就是要繼承的超類類名,類名之間以逗號間隔。 -注意多重繼承,如果一個方法從多個超類繼承,那麼需要注意一下這些超類的順序,先繼承的類中的方法會重寫後繼承的類中的方法。。這個好像很彆扭
>>> class ClassA: def talk(self): print 'this is A talking' >>> class ClassB: def talk(self): print 'this is B talking' >>> class ClassC(ClassA,ClassB): def ctalk(self): print 'c is talking' >>> c = ClassC() >>> c.talk() this is A talking 5.介面 -python裡面竟然不需要顯示的定義介面...和java完全不同,不需要顯示的規定對象必須包含哪些方法才能作為某個方法的參數使用...可以在使用對象的時候假定已經實現了接 口,如果不能實現的話,程式自然會失敗... -這裡有幾個方法來檢查方法是否存在,是否可以被調用。 -hasattr(對象名,方法名)方法,判斷方法在該對象內是否存在
>>> class ClassA: def func1(self): print 'this is func1' >>> cla_a = ClassA() >>> hasattr(cla_a,'func1')