Python - 面對對象(其餘相關,異常處理,反射,單例模式,等..)

Python - 面對對象(其餘相關,異常處理,反射,等..)

1、isinstance(obj, cls)

檢查是否obj是不是類 cls 的對象編程

class Foo(object):
    pass
 
obj = Foo()
 
isinstance(obj, Foo)

2、issubclass(sub, super)

檢查sub類是不是 super 類的派生類設計模式

class Foo(object):
    pass
 
class Bar(Foo):
    pass
 
issubclass(Bar, Foo)

3、異常處理

1. 異常處理

在編程過程當中爲了增長友好性,在程序出現bug時通常不會將錯誤信息顯示給用戶,而是現實一個提示的頁面,通俗來講就是不讓用戶看見大黃頁!!!併發

try:
    pass
except Exception,ex:
    pass

需求:將用戶輸入的兩個數字相加函數

while True:
    num1 = raw_input('num1:')
    num2 = raw_input('num2:')
    try:
        num1 = int(num1)
        num2 = int(num2)
        result = num1 + num2
    except Exception, e:
        print '出現異常,信息以下:'
        print e

2.異常種類

python中的異常種類很是多,每一個異常專門用於處理某一項異常!!!設計

經常使用的異常

AttributeError 試圖訪問一個對象沒有的樹形,好比foo.x,可是foo沒有屬性x
IOError 輸入/輸出異常;基本上是沒法打開文件
ImportError 沒法引入模塊或包;基本上是路徑問題或名稱錯誤
IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊
IndexError 下標索引超出序列邊界,好比當x只有三個元素,卻試圖訪問x[5]
KeyError 試圖訪問字典裏不存在的鍵
KeyboardInterrupt Ctrl+C被按下
NameError 使用一個還未被賦予對象的變量
SyntaxError Python代碼非法,代碼不能編譯(我的認爲這是語法錯誤,寫錯了)
TypeError 傳入對象類型與要求的不符合
UnboundLocalError 試圖訪問一個還未被設置的局部變量,基本上是因爲另有一個同名的全局變量,
致使你覺得正在訪問它
ValueError 傳入一個調用者不指望的值,即便值的類型是正確的

實例code

dic = ["wupeiqi", 'alex']
try:
    dic[10]
except IndexError, e:
    print e


dic = {'k1':'v1'}
try:
    dic['k20']
except KeyError, e:
    print e

s1 = 'hello'
try:
    int(s1)
except ValueError, e:
    print e

對於上述實例,異常類只能用來處理指定的異常狀況,若是非指定異常則沒法處理。對象

未捕獲到異常,程序直接報錯
 
s1 = 'hello'
try:
    int(s1)
except IndexError,e:
    print e

因此,寫程序時須要考慮到try代碼塊中可能出現的任意異常,能夠這樣寫:索引

s1 = 'hello'
try:
    int(s1)
except IndexError,e:
    print e
except KeyError,e:
    print e
except ValueError,e:
    print e

萬能異常 在python的異常中,有一個萬能異常:Exception,他能夠捕獲任意異常,即:內存

s1 = 'hello'
try:
    int(s1)
except Exception,e:
    print e

接下來你可能要問了,既然有這個萬能異常,其餘異常是否是就能夠忽略了!

答:固然不是,對於特殊處理或提醒的異常須要先定義,最後定義Exception來確保程序正常運行。

s1 = 'hello'
try:
    int(s1)
except KeyError,e:
    print '鍵錯誤'
except IndexError,e:
    print '索引錯誤'
except Exception, e:
    print '錯誤'

3.異常其餘結構

try:
    # 主代碼塊
    pass
except KeyError,e:
    # 異常時,執行該塊
    pass
else:
    # 主代碼塊執行完,執行該塊
    pass
finally:
    # 不管異常與否,最終執行該塊
    pass

4.主動觸發異常

try:
    raise Exception('錯誤了。。。')
except Exception,e:
    print e

5.自定義異常

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.斷言

# assert 條件
 
assert 1 == 1
 
assert 1 == 2

4、反射

python中的反射功能是由如下四個內置函數提供:hasattr、getattr、setattr、delattr,改四個函數分別用於對對象內部執行:檢查是否含有某成員、獲取成員、設置成員、刪除成員。

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

類是對象

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

反射也是對象

#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
"""
程序目錄:
    home.py
    index.py
 
當前文件:
    index.py
"""
 
 
import home as obj
 
#obj.dev()
 
func = getattr(obj, 'dev')
func()

五. 單例模式

設計模式之單例模式

單例設計模式是怎麼來的?
在面向對象的程序設計中,當業務併發量很是大時,那麼就會出現重複建立相同的對象,每建立一個對象就會開闢一塊內存空間,而這些對象實際上是如出一轍的,那麼有沒有辦法使用得內存對象只建立一次,而後再隨處使用呢?單例模式就是爲了解決這個問題而產生的。

實現方式:
1、建立一個類靜態字段(類變量)__instance
2、建立一個靜態函數,經過函數的邏輯判斷 __instance 是否已存在,如不存在就將對象值賦於__instance,即__instance = 類(),不然直接返回__instance,也即建立的對象都是同樣的
3、使用單例模式建立對象時直接經過類調用靜態函數建立便可

#普通模式
class A(object):
    def __init__(self,name,male):
        self.name = name
        self.name = male

#實例化多個對象
obj1 = A('ben','boy')
obj2 = A('min','girl')
obj3 = A('miao','boy')
##打印內存地址,能夠看到內存地址都是不同的
print id(obj1),id(obj2),id(obj3)

#單例模式
class A(object):
    __instance = None
    def __init__(self,name,male):
        self.name = name
        self.name = male
    @staticmethod
    def create_obj():
        if not A.__instance:
            A.__instance = A('ben','boy')
            return A.__instance
        else:
            return A.__instance

#單例模式實例化多個對象
obj1 = A.create_obj()
obj2 = A.create_obj()
obj3 = A.create_obj()
##打印內存地址,能夠看到內存地址都是同樣的
print id(obj1),id(obj2),id(obj3)

result :

1 >>> #普通模式
 2 ... class A(object):
 3 ...     def __init__(self,name,male):
 4 ...         self.name = name
 5 ...         self.name = male
 6 ... 
 7 >>> #實例化多個對象
 8 ... obj1 = A('ben','boy')
 9 >>> obj2 = A('min','girl')
10 >>> obj3 = A('miao','boy')
11 >>> ##打印內存地址,能夠看到內存地址都是不同的
12 ... print id(obj1),id(obj2),id(obj3)
13 140230687882448 140230687882512 140230687882576
14 >>> 
15 >>> #單例模式
16 ... class A(object):
17 ...     __instance = None
18 ...     def __init__(self,name,male):
19 ...         self.name = name
20 ...         self.name = male
21 ...     @staticmethod
22 ...     def create_obj():
23 ...         if not A.__instance:
24 ...             A.__instance = A('ben','boy')
25 ...             return A.__instance
26 ...         else:
27 ...             return A.__instance
28 ... 
29 >>> #單例模式實例化多個對象
30 ... obj1 = A.create_obj()
31 >>> obj2 = A.create_obj()
32 >>> obj3 = A.create_obj()
33 >>> ##打印內存地址,能夠看到內存地址都是同樣的
34 ... print id(obj1),id(obj2),id(obj3)
35 140230687882832 140230687882832 140230687882832
36 >>>
相關文章
相關標籤/搜索