面向對象,魔術方法

面向對象

一面向對象

  1. 什么是面向對象:
    一種認識世界、分析世界的方法論。將萬事萬物抽象為類。
  2. 類class:
    類是抽象的概念,是萬事萬物的抽象,是一類事物的共同集合的集合。
    用計算機語言來描述類,就是屬性和方法的集合。
  3. 對象instance,object:
    對象是類的具象,是一個實體。
    每個個體都是抽象類的不同實體。
  4. 哲學
    一切皆對象
    對象是數據和操作的封裝
    對象是獨立的,但是對象之間可以相互作用
    目前OOP(面向對象編程)是最接近人類認知的編程范式
  5. 面向對象三要素
    1. 封裝
      組裝:將數據和操作封裝在一起
      隱藏數據:對外只保留一些接口通過接口訪問對象
    2. 繼承
      多復用,繼承來的就不用自己寫了
      多繼承少修改,OCP(Open-closed Princeple),使用繼承來改變,來體現個性
    3. 面向對象變成最靈活的地方,動態綁定

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的多繼承實現

注意:應該盡量避免使用多繼承。

  1. Mixin

Mixin類

Mixin本質就是多繼承的實現。

Mixin體現的是一種組合的設計模式。

在面向對象的設計中,一個復雜的類,往往需要很多功能,而這些功能又來自不同的類,這就需要很多類組合在一起。

從設計角度來說,多組合,少繼承。

Mixin類使用原則

Mixin類不應顯示出現init的初始方法

通常不能獨立工作,因為它是準備混入別的類中的部分功能

Mixin類的祖先類也應該是Mixin類

注意:使用時,Mixin類通常在類繼承的第一個位置

Mixin類和裝飾器使用看個人喜好。但是如果需要繼承就要使用Minxin類的方式了。

魔術方法

特殊屬性

查看屬性

  1. 魔術方法分類:
    1. 創建、初始化和銷毀
    2. hash
    3. bool
    4. 可視化
    5. 運算符重載
    6. 容器和大小
    7. 可調用對象
    8. 上下文管理
    9. 反射
    10. 描述器
    11. 其他雜項

hash相等只是hash沖突,不能說明兩個對象相等。

一般來說提供hash方法是為了作為set或者dict的可以,所以去重還要同時提供eq方法。

運算符重載應用場景

往往是用面向對象實現的類,需要大量的運算,而運算符是這種運算在數學上最常見的表達方式。

提供運算符重載,比直接提供加法方法更適合該領域的使用者習慣。

python提供了

這個裝飾器可能帶來性能問題。所以不如自己實現。

實現方法很簡單除了eq方法必須有之外,lt,gt有其一和le,ge有其一就能實現和裝飾器一樣的功能。

上下文管理

上下文管理的安全性:安全。

就算是退出了python解釋器依舊能夠執行exit函數說明上下文管理很安全。

  1. 上下文應用場景
    1. 增強功能:
      在代碼執行的前后增加代碼,增強功能。類似裝飾器的功能。
    2. 資源管理:
      打開的資源需要關閉
    3. 權限驗證:
      在代碼執行之前,做權限驗證,在enter方法中處理。

反射

運行時,區別于編譯時,指的是程序被加載到內存中執行的時候。

反射,reflectio,指的是運行時獲取類型定義信息。

一個對象能在運行時,像照鏡子一樣,反射出他的類型信息。

簡單說,在python中,能夠通過一個對象,找出其type,、class、attri或method的能力,稱為反射或者自省。

具有反射能力的函數有:type()、isinstance()、callable()、dir()、getattr()

1.python提供了內置的函數

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/98476

(1)
陽光和蘇陽光和蘇
上一篇 2018-05-14 08:55
下一篇 2018-05-14

相關推薦

欧美性久久久久