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、異常基礎
在編程過程中為了增加友好性,在程序出現bug時一般不會將錯誤信息顯示給用戶,而是現實一個提示的頁面,通俗來說就是不讓用戶看見大黃頁!!!
| 1 2 3 4 | 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 + num2except Exception, e:print '出現異常,信息如下:'print e View Code2、異常種類
python中的異常種類非常多,每個異常專門用于處理某一項異常!!!
AttributeError 試圖訪問一個對象沒有的樹形,比如foo.x,但是foo沒有屬性x IOError 輸入/輸出異常;基本上是無法打開文件 ImportError 無法引入模塊或包;基本上是路徑問題或名稱錯誤 IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊 IndexError 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5] KeyError 試圖訪問字典里不存在的鍵 KeyboardInterrupt Ctrl+C被按下 NameError 使用一個還未被賦予對象的變量 SyntaxError Python代碼非法,代碼不能編譯(個人認為這是語法錯誤,寫錯了) TypeError 傳入對象類型與要求的不符合 UnboundLocalError 試圖訪問一個還未被設置的局部變量,基本上是由于另有一個同名的全局變量, 導致你以為正在訪問它 ValueError 傳入一個調用者不期望的值,即使值的類型是正確的 常用異常 ArithmeticError AssertionError AttributeError BaseException BufferError BytesWarning DeprecationWarning EnvironmentError EOFError Exception FloatingPointError FutureWarning GeneratorExit ImportError ImportWarning IndentationError IndexError IOError KeyboardInterrupt KeyError LookupError MemoryError NameError NotImplementedError OSError OverflowError PendingDeprecationWarning ReferenceError RuntimeError RuntimeWarning StandardError StopIteration SyntaxError SyntaxWarning SystemError SystemExit TabError TypeError UnboundLocalError UnicodeDecodeError UnicodeEncodeError UnicodeError UnicodeTranslateError UnicodeWarning UserWarning ValueError Warning ZeroDivisionError 更多異常 dic = ["wupeiqi", 'alex'] try:dic[10] except IndexError, e:print e 實例:IndexError dic = {'k1':'v1'} try:dic['k20'] except KeyError, e:print e 實例:KeyError s1 = 'hello' try:int(s1) except ValueError, e:print e 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,改四個函數分別用于對對象內部執行:檢查是否含有某成員、獲取成員、設置成員、刪除成員。
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 # 執行方法 obj.func() |
d、比較三種訪問方式
- obj.name
- obj.__dict__['name']
- getattr(obj, 'name')
答:第一種和其他種比,...
? ? ? 第二種和第三種比,...
結論:反射是通過字符串的形式操作對象相關的成員。一切事物都是對象!!!
#!/usr/bin/env python # -*- coding:utf-8 -*-import sysdef s1():print 's1'def s2():print 's2'this_module = sys.modules[__name__]hasattr(this_module, 's1') getattr(this_module, 's2') 反射當前模塊成員類也是對象
| 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') |
模塊也是對象
#!/usr/bin/env python # -*- coding:utf-8 -*-def dev():return 'dev' 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()? |
拓展:
import 模塊 (反射實現):
a = __import__("模塊名")
a = __import__('lib.test.com', fromlist=True)
轉載于:https://www.cnblogs.com/LiCheng-/p/6444948.html
總結
以上是生活随笔為你收集整理的python——面向对象相关的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python语言学习笔记整理
- 下一篇: python更新后yum问题