SlideShare a Scribd company logo
Submit Search
Upload
Login
Signup
進階主題
Report
Justin Lin
Follow
Technology / Community Evangelist at Free lancer
Aug. 17, 2016
•
0 likes
•
3,009 views
1
of
61
進階主題
Aug. 17, 2016
•
0 likes
•
3,009 views
Download Now
Download to read offline
Report
Software
《Python 3.5 技術手冊》第 14 章投影片
Justin Lin
Follow
Technology / Community Evangelist at Free lancer
Recommended
從模組到類別
Justin Lin
1.7K views
•
62 slides
5. 建構式、原型與類別
Justin Lin
205 views
•
61 slides
型態與運算子
Justin Lin
1.8K views
•
69 slides
5. 從模組到類別
Justin Lin
165 views
•
63 slides
從模組到類別
Justin Lin
500 views
•
63 slides
物件封裝
Justin Lin
1.1K views
•
74 slides
More Related Content
What's hot
Java SE 8 技術手冊第 4 章 - 認識物件
Justin Lin
4.2K views
•
91 slides
4. 使用物件
Justin Lin
174 views
•
52 slides
Java SE 8 技術手冊第 5 章 - 物件封裝
Justin Lin
3.4K views
•
74 slides
流程語法與函式
Justin Lin
509 views
•
71 slides
Java SE 8 技術手冊第 10 章 - 輸入輸出
Justin Lin
2.6K views
•
48 slides
資料結構
Justin Lin
1.8K views
•
62 slides
What's hot
(20)
Java SE 8 技術手冊第 4 章 - 認識物件
Justin Lin
•
4.2K views
4. 使用物件
Justin Lin
•
174 views
Java SE 8 技術手冊第 5 章 - 物件封裝
Justin Lin
•
3.4K views
流程語法與函式
Justin Lin
•
509 views
Java SE 8 技術手冊第 10 章 - 輸入輸出
Justin Lin
•
2.6K views
資料結構
Justin Lin
•
1.8K views
進階主題
Justin Lin
•
714 views
9. 資料結構
Justin Lin
•
284 views
Python面向对象开发基础篇
modou li
•
1.2K views
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Justin Lin
•
3.1K views
型態與運算子
Justin Lin
•
702 views
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
Justin Lin
•
2.2K views
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Justin Lin
•
1.9K views
反射與類別載入器
Justin Lin
•
562 views
Java SE 8 技術手冊第 12 章 - Lambda
Justin Lin
•
4.4K views
10. 資料永續與交換
Justin Lin
•
148 views
認識物件
Justin Lin
•
1.1K views
《Python 3.5 技術手冊》第六章草稿
Justin Lin
•
3.2K views
Java SE 7 技術手冊投影片第 09 章 - Collection與Map
Justin Lin
•
2.5K views
Java SE 8 技術手冊第 3 章 - 基礎語法
Justin Lin
•
5.3K views
Viewers also liked
Python Tricks That You Can't Live Without
Audrey Roy
29.6K views
•
45 slides
Advance OOP concepts in Python
Sujith Kumar
19.3K views
•
23 slides
Basics of Object Oriented Programming in Python
Sujith Kumar
33.7K views
•
29 slides
Python 2-基本語法
阿Samn的物理課本
5.7K views
•
25 slides
Python 2 vs. Python 3
Pablo Enfedaque
5.9K views
•
18 slides
Introduction to Python
amiable_indian
36.6K views
•
62 slides
Viewers also liked
(20)
Python Tricks That You Can't Live Without
Audrey Roy
•
29.6K views
Advance OOP concepts in Python
Sujith Kumar
•
19.3K views
Basics of Object Oriented Programming in Python
Sujith Kumar
•
33.7K views
Python 2-基本語法
阿Samn的物理課本
•
5.7K views
Python 2 vs. Python 3
Pablo Enfedaque
•
5.9K views
Introduction to Python
amiable_indian
•
36.6K views
Python的50道陰影
Tim (文昌)
•
4K views
《Python 3.5 技術手冊》第二章草稿
Justin Lin
•
4.5K views
Python 3 Programming Language
Tahani Al-Manie
•
11.4K views
流程語法與函式
Justin Lin
•
2.6K views
並行與平行
Justin Lin
•
2.6K views
除錯、測試與效能
Justin Lin
•
1.7K views
Python Programming Essentials - M44 - Overview of Web Development
P3 InfoTech Solutions Pvt. Ltd.
•
1.8K views
Python
Shivam Gupta
•
33.9K views
類別的繼承
Justin Lin
•
1.4K views
資料永續與交換
Justin Lin
•
1.8K views
Python Programming Essentials - M22 - File Operations
P3 InfoTech Solutions Pvt. Ltd.
•
1.5K views
從 REPL 到 IDE
Justin Lin
•
2.3K views
例外處理
Justin Lin
•
1.4K views
open() 與 io 模組
Justin Lin
•
1.8K views
More from Justin Lin
Ch14 簡介 Spring Boot
Justin Lin
859 views
•
22 slides
Ch13 整合 Spring MVC/Security
Justin Lin
279 views
•
58 slides
Ch12 Spring 起步走
Justin Lin
262 views
•
31 slides
Ch11 簡介 JavaMail
Justin Lin
155 views
•
8 slides
Ch10 Web 容器安全管理
Justin Lin
152 views
•
30 slides
Ch09 整合資料庫
Justin Lin
229 views
•
92 slides
More from Justin Lin
(20)
Ch14 簡介 Spring Boot
Justin Lin
•
859 views
Ch13 整合 Spring MVC/Security
Justin Lin
•
279 views
Ch12 Spring 起步走
Justin Lin
•
262 views
Ch11 簡介 JavaMail
Justin Lin
•
155 views
Ch10 Web 容器安全管理
Justin Lin
•
152 views
Ch09 整合資料庫
Justin Lin
•
229 views
Ch08 自訂標籤
Justin Lin
•
131 views
Ch07 使用 JSTL
Justin Lin
•
155 views
Ch06 使用 JSP
Justin Lin
•
245 views
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin
•
199 views
Ch04 會話管理
Justin Lin
•
235 views
Ch03 請求與回應
Justin Lin
•
230 views
Ch02 撰寫與設定 Servlet
Justin Lin
•
336 views
CH1. 簡介 Web 應用程式
Justin Lin
•
1.1K views
13.並行、平行與非同步
Justin Lin
•
233 views
12. 除錯、測試與效能
Justin Lin
•
148 views
11. 常用內建模組
Justin Lin
•
140 views
8. open() 與 io 模組
Justin Lin
•
242 views
7. 例外處理
Justin Lin
•
114 views
6. 類別的繼承
Justin Lin
•
165 views
進階主題
2.
14. 進階主題 • 學習目標 –
運用描述器 – 實作裝飾器 – 定義 meta 類別 – 使用相對匯入
3.
描述器 • 擁有 __get__()
方法,以及選擇性的 __set__()、__delete__() 方法 • 當描述器成為某個類別的屬性成員時,對 於類別屬性或者其實例屬性的取得、設定 或刪除,將會交由描述器來決定如何處理
5.
• 當 Descriptor
被指定給 Some 類別的 x 屬性時,對於 Some 實例 s 的屬性取值、 指定或刪除,分別相當於進行了以下動作: • 對於 Some.x 這個取值動作,則相當於:
8.
• 資料描述器可以攔截對實例的屬性取得、 設定與刪除行為 • 非資料描述器,是用來攔截透過實例取得 類別屬性時的行為
10.
• 若想控制可以指定給物件的屬性名稱,可 以在定義類別時指定 __slots__ •
這個屬性要是個字串清單,列出可指定給 物件的屬性名稱
12.
• 如果類別定義時指定了 __slots__,那麼 從類別建構出來的實例就不會具有 __dict__
屬性
14.
• __slots__ 中的屬性,Python
會將之實 作為描述器
15.
• __slots__ 屬性最好作為類別屬性來使用 •
父類別中定義的 __slots__,僅可以透過 父類別來取得,而子類別的 __slots__ 則 僅可以透過子類別來取得
16.
• 若父類別中沒有定義 __slots__,子類別 即使定義了__slots__,以子類別建構出 來的實例,仍然會具有
__dict__ 屬性
17.
• 如果父類別定義了__slots__,而子類別 沒有定義自己的 __slots__,子類別建構 出來的實例也會有
__dict__
18.
• 物件本身可以決定存取屬性的行為 • __getattribute__()
一但定義,任何 屬性的尋找都會被攔截,即使是那些 __xxx__ 的內建屬性名稱 • __getattr__() 的作用,是作為尋找屬 性的最後一個機會
19.
• 取得屬性的順序 – 實例的
__getattribute__() – 資料描述器的 __get__() – 實例的 __dict__ – 非資料描述器的 __get__() – 實例的 __getattr__()
20.
• __setattr__() 的作用,在於攔截所有 對實例的屬性設定 •
設定屬性順序記憶 – 實例的 __setattr__() – 資料描述器的 __set__() – 實例的 __dict__
21.
• __delattr__()的作用,在於攔截所有對 實例的屬性設定 • 刪除屬性順序記憶 –
實例的__delattr__() – 資料描述器的__delete__() – 實例的__dict__
22.
函式裝飾器 • 裝飾器本質上就是一個函式可接受函式且 傳回函式 • 假設你設計了一個點餐程式…
23.
• 一個函式可以接受函式並傳回函式
26.
• 如果裝飾器語法需要帶有參數,用來作為 裝飾器的函式,必須先以指定的參數執行 一次,傳回函式物件再來裝飾指定的函式
29.
• 除了對函式進行裝飾之外,也可以對類別 作裝飾,也就是所謂類別裝飾器
31.
• 除了使用函式來定義裝飾器之外,也可以 使用類別來定義裝飾器
32.
• 若要使用類別來定義函式裝飾器:
33.
• 若要以定義類別方式,來對函式進行裝飾:
34.
• 若要以定義類別的方式,實作對類別的裝 飾器:
36.
• 可以對類別上定義之方法進行裝飾 • 可以選擇使用函式或者類別來實作 •
方法的第一個參數總是類別的實例本身
37.
• 讓 @log
裝飾的對象,不限於可接受兩個引 數的方法
40.
認識 type 類別 •
每個物件實例本身都有個 __class__ 屬性 • 類別本身也有個 __class__ 屬性
41.
• 在類別上呼叫 __call__()
會如何呢?
42.
• 使用 type
類別建構類別時,必須指定三個 引數 – 類別名稱(字串) – 類別的父類別(tuple) – 類別的屬性(dict)
43.
• 物件是類別的實例,而類別是 type
的實例 • 如果有方法能介入 type 建立實例與初始化 的過程,就會有辦法改變類別的行為,這 就是 meta 類別的基本概念
44.
• type 是個類別,那麼可以繼承嗎?
45.
• 可以在使用 class
定義類別時,指定 metaclass 為 SomeMeta:
46.
• 繼承了 type
的類別可以作為 meta 類別 • metaclass 是個協定 • 若指定了 metaclass 的類別, Python 在 剖析完類別定義後, 會使用指定的 metaclass 來進行類別的建構與初始化
47.
• 如果使用 class
定義類別時繼承某個父類 別,亦想要指定 metaclass • 使用類別建立物件時:
48.
• 若想改變一個類別建立實例與初始化的流 程,則可以在定義 meta
類別時定義 __call__()方法:
49.
• meta 類別就是
type 的子類別 • 藉由 metaclass = MetaClass 的協定, 可在類別定義剖析完後,繞送至指定的 meta 類別 • 可以定義 meta 類別的 __new__()方法, 決定類別如何建立 – 定義 meta 類別的 __init__(),可以決定類 別如何初始 – 定義 meta 類別的__call__()方法,決定若 使用類別來建構物件時,該如何進行物件的建 立與初始
50.
• metaclass 並不僅僅可指定類別 •
可以指定的對象可以是類別、函式或任何 的物件,只要它具有 __call__() 方法
52.
• 可以定義類別的 __abstractmethods__, 指明某些特性是抽象方法
53.
• 子類別不會看的到父類別的 __abstractmethods__
56.
• Python 實際上還支援相對匯入(Relative import) •
如果想在 xyz.py 中匯入 abc 模組,在 xyz.py 中不能寫 import abc,在 Python 3 中這會是絕對匯入 • 實際上會匯入的是標準程式庫的 abc 模組
57.
• 如果想在 xyz.py
中匯入 mno 模組,在 xyz.py 中不能寫 import mno • 這會引發 ImportError,指出沒有 mno 這個模組 • 如果要使用絕對匯入,必須撰寫 import pkg1.mno • 若要使用相對匯入,則可以撰寫 from . import mno • 如果想使用的是 mno 模組中的 foo()函式, 使用相對匯入的話,還可以撰寫 from .mno import foo 這樣的方式
58.
• 在某個程式中,若 import
pkg1 的話, 會執行__init__.py 的內容 • 可以在 pkg1 的 __init__.py 中撰寫: • 只要 import pkg1,就可以直接使用 pkg1.abc、pkg2.mno、pkg1.xyz 來使 用模組了
59.
• 如果想要 import
pkg1 之後,可以直接 使用 pkg1.abc、pkg2.mno、pkg1.xyz • 還能直接使用 pkg1.sub_pkg.foo、 pkg1.sub_pkg.orz 模組
60.
• 那麼在 pkg1
的 __init__.py 中,可以撰寫: • 而在 pkg1.sub_pkg 的 __init__.py 中,可 以撰寫:
61.
• 相對匯入只能用在套件之中,如果試圖使 用 python
直譯器執行的某個模組中含有 相對匯入,會引發 SystemError