日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Python之路【第五篇】:面向对象及相关

發(fā)布時間:2023/11/27 生活经验 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python之路【第五篇】:面向对象及相关 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Python之路【第五篇】:面向對象及相關

Python之路【第五篇】:面向對象及相關

面向對象基礎

基礎內(nèi)容介紹詳見一下兩篇博文:

  • 面向對象初級篇
  • 面向對象進階篇

其他相關

一、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、異常基礎

在編程過程中為了增加友好性,在程序出現(xiàn)bug時一般不會將錯誤信息顯示給用戶,而是現(xiàn)實一個提示的頁面,通俗來說就是不讓用戶看見大黃頁!!!

1 2 3 4 try: ????pass except?Exception,ex: ????pass

需求:將用戶輸入的兩個數(shù)字相加

?View Code

2、異常種類

python中的異常種類非常多,每個異常專門用于處理某一項異常!!!

?常用異常 ?更多異常 ?實例:IndexError ?實例:KeyError ?實例:ValueError

對于上述實例,異常類只能用來處理指定的異常情況,如果非指定異常則無法處理。

1 2 3 4 5 6 7 # 未捕獲到異常,程序直接報錯 s1?=?'hello' try: ????int(s1) except?IndexError,e: ????print?e

所以,寫程序時需要考慮到try代碼塊中可能出現(xiàn)的任意異常,可以這樣寫:

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: ????# 異常時,執(zhí)行該塊 ????pass else: ????# 主代碼塊執(zhí)行完,執(zhí)行該塊 ????pass finally: ????# 無論異常與否,最終執(zhí)行該塊 ????pass

4、主動觸發(fā)異常

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中的反射功能是由以下四個內(nèi)置函數(shù)提供:hasattr、getattr、setattr、delattr,改四個函數(shù)分別用于對對象內(nèi)部執(zhí)行:檢查是否含有某成員、獲取成員、設置成員、刪除成員。

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')

詳細解析:

當我們要訪問一個對象的成員時,應該是這樣操作:

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 # 執(zhí)行方法 obj.func()
?? 那么問題來了? a、上述訪問對象成員的 name 和 func 是什么?? 答:是變量名 b、obj.xxx 是什么意思?? 答:obj.xxx 表示去obj中或類中尋找變量名 xxx,并獲取對應內(nèi)存地址中的內(nèi)容。 c、需求:請使用其他方式獲取obj對象中的name變量指向內(nèi)存中的值 “alex” ?View Code

答:有兩種方式,如下:

?方式一 ?方式二

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()?

設計模式

一、單例模式

單例,顧名思義單個實例。

學習單例之前,首先來回顧下面向對象的內(nèi)容:

python的面向對象由兩個非常重要的兩個“東西”組成:類、實例

面向對象場景一:

如:創(chuàng)建三個游戲人物,分別是:

  • 蒼井井,女,18,初始戰(zhàn)斗力1000
  • 東尼木木,男,20,初始戰(zhàn)斗力1800
  • 波多多,女,19,初始戰(zhàn)斗力2500
?View Code

面向對象場景二:

如:創(chuàng)建對數(shù)據(jù)庫操作的公共類

?View Code

實例:結合場景二實現(xiàn)Web應用程序

?Web應用程序實例

對于上述實例,每個請求到來,都需要在內(nèi)存里創(chuàng)建一個實例,再通過該實例執(zhí)行指定的方法。

那么問題來了...如果并發(fā)量大的話,內(nèi)存里就會存在非常多功能上一模一樣的對象。存在這些對象肯定會消耗內(nèi)存,對于這些功能相同的對象可以在內(nèi)存中僅創(chuàng)建一個,需要時都去調(diào)用,也是極好的!!!

鐺鐺 鐺鐺?鐺鐺鐺鐺鐺,單例模式出馬,單例模式用來保證內(nèi)存中僅存在一個實例!!!

通過面向對象的特性,構造出單例模式:

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單例模式,創(chuàng)建對象時不能再直接使用:obj = Foo(),而應該調(diào)用特殊的方法: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):# 連接數(shù)據(jù)庫# 拼接sql語句# 操作passdef create(self):# 連接數(shù)據(jù)庫# 拼接sql語句# 操作passdef remove(self):# 連接數(shù)據(jù)庫# 拼接sql語句# 操作passdef modify(self):# 連接數(shù)據(jù)庫# 拼接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()

總結:單利模式存在的目的是保證當前內(nèi)存中僅存在單個實例,避免內(nèi)存浪費!!!

posted on 2016-11-06 21:08?mike.liu 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/guisheng/p/6036383.html

總結

以上是生活随笔為你收集整理的Python之路【第五篇】:面向对象及相关的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。