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 主動觸發異常
raise
exception(
'錯誤了。。。'
)
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...