1. 程式人生 > 其它 >Python 基礎:類與函式

Python 基礎:類與函式

1、Python 中的類(上)

1.1 資料屬性

  • 類資料屬性和例項資料屬性
  • 特殊的類屬性
  • 屬性隱藏

1.2 方法

  • 例項方法
  • 類方法
  • 靜態方法

1.3 訪問控制

  • 單下劃線”_”
  • 雙下劃線”__”

1.4 總結:

本文介紹了Python中class的一些基本點:

  • 例項資料屬性和類資料屬性的區別,以及屬性隱藏
  • 例項方法,類方法和靜態方法直接的區別
  • Python中通過”_”和”__”實現的訪問控制

Refer:http://python.jobbole.com/82297/

2、Python 中的類(中)

2.1 繼承

  • 繼承中的__init__
  • super
  • MRO
  • __slots__
  • 子類沒有__slots__屬性
  • 子類擁有__slots__屬性

2.2 總結:

  • 本文介紹了Python中的繼承,當使用多繼承的時候,可以使用super關鍵字去訪問父類中被子類覆蓋的方法;對於方法的呼叫,需要參照MRO。
  • 另外介紹了Python類的__slots__屬性,通過這個屬性可以限制類例項的可用屬性。

Refer:http://python.jobbole.com/82308/

3、Python 中的類(下)

3.1 類構造和初始化

  • __new__特性
  • 重寫__new__
  • __init__的呼叫
  • 派生不可變型別

3.2 定製一個類

3.3 總結:

  • 文中介紹了類的構造和初始化方法:”__new__”和”__init__”。
  • “__new__”方法是新式類特有的方法,通常情況下,__new__方法會建立返回cls(cls指代當前類)的例項,然後呼叫該類的”__init__”方法作為初始化方法,該方法接收這個例項(即self)作為自己的第一個引數,然後依次傳入”__new__”方法中接收的位置引數和命名引數;但是,如果”__new__”沒有返回cls(即當前類)的例項,那麼當前類的”__init__”方法是不會被呼叫的。
  • 通過”魔術方法”,可以對自定義類進行定製、擴充套件,使得自定義類變得強大、易用。

Refer:http://python.jobbole.com/82312/

4、Python 中 self 的含義

  • self代表類的例項,而非類
  • self不必非寫成self
  • self可以不寫嗎
  • 在繼承時,傳入的是哪個例項,就是那個傳入的例項,而不是指定義了self的類的例項
  • 在描述符類中,self指的是描述符類的例項

總結:

  • self在定義時需要定義,但是在呼叫時會自動傳入。
  • self的名字並不是規定死的,但是最好還是按照約定是用self
  • self總是指呼叫時的類的例項。

Refer:http://python.jobbole.com/81921/

5、Python 描述符

  • 描述符協議中定義了“__get__”、“__set__”、”__delete__” 這些特殊方法

Refer:http://python.jobbole.com/81211/

6、Python 元類(metaclass)

  • 類也是物件
  • 動態地建立類
  • 到底什麼是元類
  • __metaclass__屬性
  • 自定義元類
  • 為什麼要用metaclass類而不是函式?
  • 究竟為什麼要使用元類?

結語:

  • 首先,你知道了類其實是能夠創建出類例項的物件。好吧,事實上,類本身也是例項,當然,它們是元類的例項。
>>>class Foo(object): pass
>>> id(Foo)
142630324
  • Python中的一切都是物件,它們要麼是類的例項,要麼是元類的例項,除了type。type實際上是它自己的元類,在純Python環境中這可不是你能夠做到的,這是通過在實現層面耍一些小手段做到的。其次,元類是很複雜的。對於非常簡單的類,你可能不希望通過使用元類來對類做修改。你可以通過其他兩種技術來修改類:

1) Monkey patching

2)   class decorators

  • 當你需要動態修改類時,99%的時間裡你最好使用上面這兩種技術。當然了,其實在99%的時間裡你根本就不需要動態修改類 :D

Refer:http://python.jobbole.com/21351/

7、Python 函式相關

  • 可變長度引數(*args 和 **kwargs)
  • 非關鍵字變長引數(元組)
  • 關鍵字變長引數(字典)
  • 匿名函式(lambda)
  • 幾個內建函式:filter(),map(),reduce()

Refer:http://python.jobbole.com/82300/

8、Python 迭代器和生成器

8.1 迭代器

  • __iter__()和next()方法
  • 自定義迭代器
  • 迭代器和可迭代物件

8.2 生成器

  • 生成器執行流程
  • 生成器表示式
  • 遞迴生成器
  • 生成器的send()和close()方法

8.3 總結

本文介紹了Python迭代器和生成器的相關內容。

  • 通過實現迭代器協議對應的__iter__()和next()方法,可以自定義迭代器型別。對於可迭代物件,for語句可以通過iter()方法獲取迭代器,並且通過next()方法獲得容器的下一個元素。
  • 像列表這種序列型別的物件,可迭代物件和迭代器物件是相互獨立存在的,在迭代的過程中各個迭代器相互獨立;但是,有的可迭代物件本身又是迭代器物件,那麼迭代器就沒法獨立使用。
  • itertools模組提供了一系列迭代器,能夠幫助使用者輕鬆地使用排列、組合、笛卡爾積或其他組合結構。
  • 生成器是一種特殊的迭代器,內部支援了生成器協議,不需要明確定義__iter__()和next()方法。
  • 生成器通過生成器函式產生,生成器函式可以通過常規的def語句來定義,但是不用return返回,而是用yield一次返回一個結果。

9、from … import … 執行機制

http://python.jobbole.com/84174/

Refer:http://python.jobbole.com/82320/