Python之路【第五篇】:面向对象及相关
Python之路【第五篇】:面向對象及相關
面向對象基礎
基礎內容介紹詳見一下兩篇博文:
- 面向對象初級篇
- 面向對象進階篇
其他相關
一、isinstance(obj, cls)
?檢查是否obj是否是類 cls 的對象
| 1 2 3 4 5 6 | class?Foo(object): ????pass obj?=?Foo() isinstance(obj, Foo) |
二、issubclass(sub, super)
檢查sub類是否是 super 類的派生類
| 1 2 3 4 5 6 7 | class?Foo(object): ????pass class?Bar(Foo): ????pass issubclass(Bar, Foo) |
三、異常處理
1、異?;A
在編程過程中為了增加友好性,在程序出現bug時一般不會將錯誤信息顯示給用戶,而是現實一個提示的頁面,通俗來說就是不讓用戶看見大黃頁!!!
| 1 2 3 4 | try: ????pass except?Exception,ex: ????pass |
需求:將用戶輸入的兩個數字相加
?View Code2、異常種類
python中的異常種類非常多,每個異常專門用于處理某一項異常!!!
?常用異常 ?更多異常 ?實例:IndexError ?實例:KeyError ?實例:ValueError對于上述實例,異常類只能用來處理指定的異常情況,如果非指定異常則無法處理。
| 1 2 3 4 5 6 7 | # 未捕獲到異常,程序直接報錯 s1?=?'hello' try: ????int(s1) except?IndexError,e: ????print?e |
所以,寫程序時需要考慮到try代碼塊中可能出現的任意異常,可以這樣寫:
| 1 2 3 4 5 6 7 8 9 | s1?=?'hello' try: ????int(s1) except?IndexError,e: ????print?e except?KeyError,e: ????print?e except?ValueError,e: ????print?e |
萬能異常 在python的異常中,有一個萬能異常:Exception,他可以捕獲任意異常,即:
| 1 2 3 4 5 | s1?=?'hello' try: ????int(s1) except?Exception,e: ????print?e |
接下來你可能要問了,既然有這個萬能異常,其他異常是不是就可以忽略了!
答:當然不是,對于特殊處理或提醒的異常需要先定義,最后定義Exception來確保程序正常運行。
| 1 2 3 4 5 6 7 8 9 | s1?=?'hello' try: ????int(s1) except?KeyError,e: ????print?'鍵錯誤' except?IndexError,e: ????print?'索引錯誤' except?Exception, e: ????print?'錯誤' |
3、異常其他結構
| 1 2 3 4 5 6 7 8 9 10 11 12 | try: ????# 主代碼塊 ????pass except?KeyError,e: ????# 異常時,執行該塊 ????pass else: ????# 主代碼塊執行完,執行該塊 ????pass finally: ????# 無論異常與否,最終執行該塊 ????pass |
4、主動觸發異常
| 1 2 3 4 | try: ????raise?Exception('錯誤了。。。') except?Exception,e: ????print?e |
5、自定義異常
| 1 2 3 4 5 6 7 8 9 10 11 12 | class?WupeiqiException(Exception): ????def?__init__(self, msg): ????????self.message?=?msg ????def?__str__(self): ????????return?self.message try: ????raise?WupeiqiException('我的異常') except?WupeiqiException,e: ????print?e |
6、斷言
| 1 2 3 4 5 | # assert 條件 assert?1?==?1 assert?1?==?2 |
四、反射
python中的反射功能是由以下四個內置函數提供:hasattr、getattr、setattr、delattr,改四個函數分別用于對對象內部執行:檢查是否含有某成員、獲取成員、設置成員、刪除成員。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class?Foo(object): ????def?__init__(self): ????????self.name?=?'wupeiqi' ????def?func(self): ????????return?'func' obj?=?Foo() # #### 檢查是否含有成員 #### hasattr(obj,?'name') hasattr(obj,?'func') # #### 獲取成員 #### getattr(obj,?'name') getattr(obj,?'func') # #### 設置成員 #### setattr(obj,?'age',?18) setattr(obj,?'show',?lambda?num: num?+?1) # #### 刪除成員 #### delattr(obj,?'name') delattr(obj,?'func') |
詳細解析:
當我們要訪問一個對象的成員時,應該是這樣操作:
?? 那么問題來了? a、上述訪問對象成員的 name 和 func 是什么?? 答:是變量名 b、obj.xxx 是什么意思?? 答:obj.xxx 表示去obj中或類中尋找變量名 xxx,并獲取對應內存地址中的內容。 c、需求:請使用其他方式獲取obj對象中的name變量指向內存中的值 “alex” ?View Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 class?Foo(object):????def?__init__(self):????????self.name?=?'alex'????def?func(self):????????return?'func'obj?=?Foo()# 訪問字段obj.name# 執行方法obj.func()答:有兩種方式,如下:
?方式一 ?方式二d、比較三種訪問方式
- obj.name
- obj.__dict__['name']
- getattr(obj, 'name')
答:第一種和其他種比,...
?Web框架實例
? ? ? 第二種和第三種比,...
結論:反射是通過字符串的形式操作對象相關的成員。一切事物都是對象!!!
?
?反射當前模塊成員?
類也是對象
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class?Foo(object): ????staticField?=?"old boy" ????def?__init__(self): ????????self.name?=?'wupeiqi' ????def?func(self): ????????return?'func' ????@staticmethod ????def?bar(): ????????return?'bar' print?getattr(Foo,?'staticField') print?getattr(Foo,?'func') print?getattr(Foo,?'bar') |
模塊也是對象
?home.py| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #!/usr/bin/env python # -*- coding:utf-8 -*- """ 程序目錄: ????home.py ????index.py 當前文件: ????index.py """ import?home as obj #obj.dev() func?=?getattr(obj,?'dev') func()? |
設計模式
一、單例模式
單例,顧名思義單個實例。
學習單例之前,首先來回顧下面向對象的內容:
python的面向對象由兩個非常重要的兩個“東西”組成:類、實例
面向對象場景一:
如:創建三個游戲人物,分別是:
?View Code
- 蒼井井,女,18,初始戰斗力1000
- 東尼木木,男,20,初始戰斗力1800
- 波多多,女,19,初始戰斗力2500
面向對象場景二:
如:創建對數據庫操作的公共類
?View Code
- 增
- 刪
- 改
- 查
實例:結合場景二實現Web應用程序
?Web應用程序實例對于上述實例,每個請求到來,都需要在內存里創建一個實例,再通過該實例執行指定的方法。
那么問題來了...如果并發量大的話,內存里就會存在非常多功能上一模一樣的對象。存在這些對象肯定會消耗內存,對于這些功能相同的對象可以在內存中僅創建一個,需要時都去調用,也是極好的!!!
鐺鐺 鐺鐺?鐺鐺鐺鐺鐺,單例模式出馬,單例模式用來保證內存中僅存在一個實例!!!
通過面向對象的特性,構造出單例模式:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # ########### 單例類定義 ########### class?Foo(object): ????__instance?=?None ????@staticmethod ????def?singleton(): ????????if?Foo.__instance: ????????????return?Foo.__instance ????????else: ????????????Foo.__instance?=?Foo() ????????????return?Foo.__instance # ########### 獲取實例 ########### obj?=?Foo.singleton() |
對于Python單例模式,創建對象時不能再直接使用:obj = Foo(),而應該調用特殊的方法:obj = Foo.singleton() 。
#!/usr/bin/env python
#coding:utf-8
from wsgiref.simple_server import make_server# ########### 單例類定義 ###########
class DbHelper(object):__instance = Nonedef __init__(self):self.hostname = '1.1.1.1'self.port = 3306self.password = 'pwd'self.username = 'root'@staticmethoddef singleton():if DbHelper.__instance:return DbHelper.__instanceelse:DbHelper.__instance = DbHelper()return DbHelper.__instancedef fetch(self):# 連接數據庫# 拼接sql語句# 操作passdef create(self):# 連接數據庫# 拼接sql語句# 操作passdef remove(self):# 連接數據庫# 拼接sql語句# 操作passdef modify(self):# 連接數據庫# 拼接sql語句# 操作passclass Handler(object):def index(self):obj = DbHelper.singleton()print id(single)obj.create()return 'index'def news(self):return 'news'def RunServer(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html')])url = environ['PATH_INFO']temp = url.split('/')[1]obj = Handler()is_exist = hasattr(obj, temp)if is_exist:func = getattr(obj, temp)ret = func()return retelse:return '404 not found'if __name__ == '__main__':httpd = make_server('', 8001, RunServer)print "Serving HTTP on port 8001..."httpd.serve_forever() 總結:單利模式存在的目的是保證當前內存中僅存在單個實例,避免內存浪費!!!
posted on 2016-11-06 21:08?mike.liu 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/guisheng/p/6036383.html
總結
以上是生活随笔為你收集整理的Python之路【第五篇】:面向对象及相关的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 来谈谈你心中的杨洋。?
- 下一篇: 红色1元纸币值多少钱?