pythond物件 異常 反射的學習筆記

2022-05-02 09:00:14 字數 3158 閱讀 2977

python多繼承,剛開始我是表示驚訝的,畢竟學的php,哪來的多繼承?頂多也就是利用介面模擬多繼承後者使用反射機制實現。那麼還是來看看python的強大吧

1 首先,python的類繼承了多個類,那麼其尋找方法的方式有兩種,分別是:深度優先(經典類)廣度優先(新式類)

class 經典類{}

#唯一的區別就是要繼承object,其之類都是新式類

class 新式類(object)

#方法尋找

class d(object):

def bar(self):

print 'd.bar'

class c(d):

def bar(self):

print 'c.bar'

class b(d):

def bar(self):

print 'b.bar'

class a(b, c): #按順序繼承,尋找也是按此順序進行

#呼叫父類構造器最好用supper()

def bar(self):

print 'a.bar'

a = a()

# 執行bar方法時

# 首先去a類中查詢,如果a類中沒有,則繼續去b類中找,如果b類中麼有,則繼續去c類中找,如果c類中麼有,則繼續去d類中找,如果還是未找到,則報錯

# 所以,查詢順序:a --> b --> c --> d

# 在上述查詢bar方法的過程中,一旦找到,則尋找過程立即中斷,便不會再繼續找了

a.bar()

# 如果是經典類:首先去a類中查詢,如果a類中沒有,則繼續去b類中找,如果b類中麼有,則繼續去d類中找,如果d類中麼有,則繼續去c類中找,如果還是未找到,則報錯

# 所以,查詢順序:a --> b --> d --> c

# 建議使用新式類

2 共有與私有成員(很多的特殊成員此處不列出)

class a:

name = "公有靜態字段"

__private = "私有靜態字段"

def __init__(self):

self.name = '公有字段'

self.__foo = "私有字段" #加上 '__' 就是私有的,外部訪問會出錯

3 檢測物件

#檢查是否obj是否是類 cls 的物件

class foo(object):

pass

obj = foo()

isinstance(obj, foo)

#檢查sub類是否是 super 類的派生類

class foo(object):

pass

class bar(foo):

pass

issubclass(bar, foo)

4 異常處理

常用的異常

attributeerror 試圖訪問乙個物件沒有的樹形,比如foo.x,但是foo沒有屬性x

ioerror 輸入/輸出異常;基本上是無法開啟檔案

importerror 無法引入模組或包;基本上是路徑問題或名稱錯誤

indentationerror 語法錯誤(的子類) ;**沒有正確對齊

indexerror 下標索引超出序列邊界,比如當x只有三個元素,卻試圖訪問x[5]

keyerror 試圖訪問字典裡不存在的鍵

keyboardinterrupt ctrl+c被按下

nameerror 使用乙個還未被賦予物件的變數

syntaxerror python**非法,**不能編譯(個人認為這是語法錯誤,寫錯了)

typeerror 傳入物件型別與要求的不符合

unboundlocalerror 試圖訪問乙個還未被設定的區域性變數,基本上是由於另有乙個同名的全域性變數,導致你以為正在訪問它

valueerror 傳入乙個呼叫者不期望的值,即使值的型別是正確的

#

結構try

:

#主**塊

pass

except

keyerror,e:

#異常時,執行該塊

pass

else

:

#主**塊執行完,執行該塊

pass

finally

:

#無論異常與否,最終執行該塊

pass

5 主動觸發異常

raiseexception('錯誤了。。。')

6 自定義異常處理

class wupeiqiexception(exception):

def __init__(self, msg):

self.message = msg

def __str__(self):

return self.message

try:

raise wupeiqiexception('出錯')

except wupeiqiexception,e:

print e

7 反射

#

#### 檢查obj是否含有成員 ####

hasattr(obj, '

name')

hasattr(obj,

'func')

##### 獲取obj成員 ####

getattr(obj, '

name')

getattr(obj,

'func')

##### 設定obj成員 ####

setattr(obj, '

age', 18)

setattr(obj,

'show

', lambda num: num + 1) #

#### 刪除obj成員 ####

delattr(obj, '

name')

delattr(obj,

'func

')

object物件的反射

有個朋友 不要問我這個朋友是誰,反正是乙個朋友 手動狗頭 在用泛型的時候,傳入乙個object型別,發現並沒有反射出內部屬性,說一下原因。1.首先需要知道 object是乙個類,但是他內部是沒有屬性的 想要反射出他的屬性,說明是將其他類裝箱成了object,例如 object a new stude...

反射獲得物件的值

反射獲得物件指定name的值 用途 用於繫結資料物件支援廣泛的型別 1 datarow中列name 2 鍵值集合中的name 3 字典資料中name 4 類的name欄位 類支援子類 獲取物件中指定name的值 datarowview和實體類物件 欄位或類成員 public static objec...

反射獲得物件的值

反射獲得物件指定name的值 用途 用於繫結資料物件支援廣泛的型別 1 datarow中列name 2 鍵值集合中的name 3 字典資料中name 4 類的name欄位 類支援子類 獲取物件中指定name的值 datarowview和實體類物件 欄位或類成員 public static objec...