面向對象
一面向對象
- 什么是面向對象:
一種認識世界、分析世界的方法論。將萬事萬物抽象為類。 - 類class:
類是抽象的概念,是萬事萬物的抽象,是一類事物的共同集合的集合。
用計算機語言來描述類,就是屬性和方法的集合。 - 對象instance,object:
對象是類的具象,是一個實體。
每個個體都是抽象類的不同實體。 - 哲學
一切皆對象
對象是數據和操作的封裝
對象是獨立的,但是對象之間可以相互作用
目前OOP(面向對象編程)是最接近人類認知的編程范式 - 面向對象三要素
- 封裝
組裝:將數據和操作封裝在一起
隱藏數據:對外只保留一些接口通過接口訪問對象 - 繼承
多復用,繼承來的就不用自己寫了
多繼承少修改,OCP(Open-closed Princeple),使用繼承來改變,來體現個性 - 面向對象變成最靈活的地方,動態綁定
- 封裝
6.實例化
實例變量是每一個實例自己的變量,是自己獨有的;類變量是類的變量,是類的所有實例共享的屬性和方法
總結
類變量所有實例共享,實例自己的類無法訪問
實例可以動態增加屬性。實例,__dict__[變量名]或實例, [變量名]訪問
實例屬性查找順序,自己的__dict__,如果沒有就通過__class__找到自己的類然后去類的__dict__
7.裝飾一個類
8.猴子補?。∕onke Patch)
在運行時,對屬性、方法、函數等進行動態替換。
其目的是為了通過替換、修改來增強、擴展原代碼的能力。
黑魔法,慎用。
9.屬性裝飾器
好的設計是:把實例屬性保護起來,不讓外部直接訪問,外部使用getter和setter讀取和修改屬性。
特別注意:使用property裝飾器的時候三個方法同名
10方法重載
python沒有重載或者說python本身就實現了其他語言的重載。
11封裝
將數據和操作組織到類中,即屬性和方法
將數據隱藏起來,給使用者提供操作(方法)。使用者通過操作就可以獲取或者修改數據。
getter和setter
通過訪問控制,暴露適當的數據和操作給用戶。該隱藏的隱藏起來,例如保護成員和私有成員。
二,類的繼承
繼承
繼承是讓子類從父類獲取特征(屬性和方法)
父類:又稱基類或超類
子類:也成派生類
總結:
繼承時,共有的,子類和實例都可以隨意訪問;私有成員被隱藏,子類和實例不能直接訪問,私有變量所在的類內的方法可以直接訪問這個私有變量。
Python通過自己的一套實現,實現了和其他語言一樣的面向對象的繼承機制。
屬性查找順序
實例的__dict__ >類__dict__如果有繼承 >父類__dict__、
如果都沒有找到就會拋異常,否則先找到就立即返回。
1.方法的重寫,覆蓋override
如果類B聲明繼承自類A,則類B的__bases__中可以看到類A。
但是這和是否調用類A的構造方法是兩回事。
如果B調用A的構造方法,就可以擁有父類的屬性了。
注意:調用父類的init方法,出現在不同的位置,可能導致不同結果。
故調用時一般把調用父類的放在最前(使用super().__init__調用)
特別注意:
一個原則,自己的私有屬性,就該自己的方法讀取和修改,不要借助其他類的方法,即使是父類或派生類的方法(因為私有屬性的改名極其容易弄混)
三,多繼承
Python2為了兼容分為舊式類和新式類
Python3全是新式類
新式類繼承自object,可以使用super。
多繼承
OCP原則:多用“繼承”、少修改。
繼承的用途:增強基類、實現多態
多態
在面向對象中,父類、子類通過繼承聯系在一起,如果通過一套方法,就可以實現不同的表現,就是多態。
一個類繼承自多個類就是多繼承,它將具有多個類的特征。
多繼承弊端
多繼承的實現會使編譯器設計的復雜度增加,現在很多語言舍棄了類的多繼承。
多繼承可能帶來二義性。
解決方案:要解決二義性,深度優先或者廣度優先。
Python的多繼承實現
注意:應該盡量避免使用多繼承。
- Mixin
Mixin類
Mixin本質就是多繼承的實現。
Mixin體現的是一種組合的設計模式。
在面向對象的設計中,一個復雜的類,往往需要很多功能,而這些功能又來自不同的類,這就需要很多類組合在一起。
從設計角度來說,多組合,少繼承。
Mixin類使用原則
Mixin類不應顯示出現init的初始方法
通常不能獨立工作,因為它是準備混入別的類中的部分功能
Mixin類的祖先類也應該是Mixin類
注意:使用時,Mixin類通常在類繼承的第一個位置
Mixin類和裝飾器使用看個人喜好。但是如果需要繼承就要使用Minxin類的方式了。
魔術方法
特殊屬性
查看屬性
- 魔術方法分類:
- 創建、初始化和銷毀
- hash
- bool
- 可視化
- 運算符重載
- 容器和大小
- 可調用對象
- 上下文管理
- 反射
- 描述器
- 其他雜項
hash相等只是hash沖突,不能說明兩個對象相等。
一般來說提供hash方法是為了作為set或者dict的可以,所以去重還要同時提供eq方法。
運算符重載應用場景
往往是用面向對象實現的類,需要大量的運算,而運算符是這種運算在數學上最常見的表達方式。
提供運算符重載,比直接提供加法方法更適合該領域的使用者習慣。
python提供了
這個裝飾器可能帶來性能問題。所以不如自己實現。
實現方法很簡單除了eq方法必須有之外,lt,gt有其一和le,ge有其一就能實現和裝飾器一樣的功能。
上下文管理
上下文管理的安全性:安全。
就算是退出了python解釋器依舊能夠執行exit函數說明上下文管理很安全。
- 上下文應用場景
- 增強功能:
在代碼執行的前后增加代碼,增強功能。類似裝飾器的功能。 - 資源管理:
打開的資源需要關閉 - 權限驗證:
在代碼執行之前,做權限驗證,在enter方法中處理。
- 增強功能:
反射
運行時,區別于編譯時,指的是程序被加載到內存中執行的時候。
反射,reflectio,指的是運行時獲取類型定義信息。
一個對象能在運行時,像照鏡子一樣,反射出他的類型信息。
簡單說,在python中,能夠通過一個對象,找出其type,、class、attri或method的能力,稱為反射或者自省。
具有反射能力的函數有:type()、isinstance()、callable()、dir()、getattr()
1.python提供了內置的函數
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/98476