Python OOP總結
摘要:面試的時候被問到幾次python的OOP都掛了,決定認真的學一遍~~
面試的時候被問到幾次python的OOP都掛了,決定認真的學一遍~~
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點中說的,所以其實想明白很重要。。而且我認為這種方法還是相當優雅滴~~
全站熱搜
留言列表