Python 基礎:類與函式
阿新 • • 發佈:2022-04-28
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 定製一個類
- 呼叫魔術方法
- python中的魔術方法__ http://python.jobbole.com/85310/
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一次返回一個結果。