python的物件導向的設計和c++等編譯語言不同,主要注意的是:
- python的類沒有存取權限的問題,也就是說所有的變數都是可訪問的。
實際上python有私人的機制,就是在屬性前加__,但是這種私人機制實際上也是偽私人,因為它其實是用一個別名來儲存這個屬性。
例如在類A中的self.__a = 4, 實際上__a被修改成了_A__a保持在類中了。
- 沒有static的說法了,類和執行個體是區分看待的,一個屬性或者方法可以屬於類也可以屬於執行個體。
看下面的例子
class A:
i = 'class var'
def __init__(self):
self.i = 'instance var'a = A()
print A.i, a.i
#result class var instance var
類和執行個體之間的元素和函數都是獨立的。
當然如果你要定義屬於類的方法,因為舊的對象定義強制方法是要帶self參數的,不然調用會出錯的,所以需要static函數,可以這樣做:
class A:
i = 'class var'
def __init__(self):
self.i = 'instance var'
def f(): pass
f = staticmethod(f)
- 類和執行個體中的屬性和方法實際上都是放在類和執行個體自身的一個字典中,就是__dict__中,所以他們實際上可以看成不同的兩個東西。
類本身也是對象,所以類和執行個體都可以在程式中的任何地方進行添加,修改和刪除。對的你甚至可以用del來刪除類中的屬性和函數。
- 那麼當你需要使用類或者執行個體中的屬性和方法時,python是如何尋找的呢?
python中的所有的類和執行個體將會根據他們的繼承關係組成一個對象屬性樹。
樹的葉子節點是執行個體,內部節點根據類之間的繼承關係來決定。
當使用A.a的方法來尋找一個節點中的某個元素時,它將在這棵樹上進行搜尋,如果當前節點沒有該元素則向上繼續搜尋直到根節點,如果向上的過程中出現兩條以上路徑(想想為什麼有這種情況),則從左邊向上走,如果到根節點還沒有找到,那麼返回到出現分叉的點再往右一條路向上。
這種尋找方法即使出現了多重繼承(其實就是上面說的兩條以上路徑)也不用擔心出現C++中的情況。大概就這些,我發現大部分面試時候還是考的這種我第4點中說的,所以其實想明白很重要。。而且我認為這種方法還是相當優雅滴~~