[python]查看純文本
# -*-編碼:utf-8 -*-
E類:
#經典類
及格
E1類(對象):
#新類別
及格
e = E()
打印“經典類”
打印e
打印類型(e)
打印e.__class__
打印“新類別”
e1 = E1()
打印e1
打印e1。__class__
打印類型(e1)
[python]查看純文本
古典類
& lt__main__。e實例在0x0000000002250B08 & gt
& lt類型“實例”& gt
__main__。E
新類
& lt__main__.E1對象位於0x 000000002248710 & gt;
& ltclass ' _ _ main _ _ . e 1 ' & gt;
& ltclass ' _ _ main _ _ . e 1 ' & gt;
我用的是python 2.7。
E1是壹個新定義的類。那麽當e1被輸入輸出時,既有類型(e1)又有e1。__class__是輸出
2.繼承搜索的順序已經改變。具有多重繼承屬性的經典類的搜索順序:先深入到繼承樹的左側,再返回開始尋找右側;新類多繼承屬性的搜索順序:先橫向搜索,再上移。
[python]查看純文本
# -*-編碼:utf-8 -*-
A類(對象):
"""
新類
作為所有類的基類。
"""
def foo(自身):
打印“A級”
A1()類:
"""
古典類
作為所有類的基類。
"""
def foo(自身):
打印“A1級”
丙類(甲類):
及格
C1類(A1):
及格
D(A)級:
def foo(自身):
打印“D類”
D1類(A1):
def foo(自身):
打印“D1類”
E類(丙類、丁類):
及格
E1類(C1,D1):
及格
e = E()
電子食物()
e1 = E1()
e1.foo()
輸出
[python]查看純文本
D類
A1級
因為新類是繼承壹個類的新類,所以我們首先要弄清楚E類中是否有foo(),如果沒有,搜索C->;d-& gt;答.這是壹種廣度優先的搜索方法。
因為經典類A1是經典類,所以首先要弄清楚E1類中是否有foo(),如果沒有,就按順序搜索c 1 > a 1-& gt;D1 .這是壹種深度優先的搜索方法。
3.新類增加了__slots__內置屬性,可以將實例屬性的類型鎖定在__slots_指定的範圍內。
例如,只允許將姓名和年齡屬性添加到實例A:
[python]查看純文本
# -*-編碼:utf-8 -*-
A類(對象):
__slots__ =('姓名','年齡')
A1()類:
__slots__ =('姓名','年齡')
a1 = A1()
a = A()
a1.name1 = "a1 "
a.name1 = "a "
是壹個添加了__slots__屬性的新類,因此只能添加name age。
A1 classic class __slots__屬性沒有用。
[python]查看純文本
回溯(最近壹次呼叫):
文件“t.py”,第13行,在& lt模塊& gt
a.name1 = "a "
attribute錯誤:“A”對象沒有屬性“name1”
所以a.name會出錯。
通常每個實例都有壹個__dict__屬性,用來記錄實例中的所有屬性和方法。也是通過這個字典,實例可以綁定到任何屬性。
__slots__屬性的作用是當C類的變量較少,有__slots__屬性時,
C類的壹個實例沒有__dict__屬性,但是將變量的值存儲在壹個固定的位置。如果您嘗試訪問沒有的__slots__,請執行以下操作
屬性,實例將報告錯誤。這種操作的優點是什麽?盡管__slots__屬性使實例失去了綁定任何屬性的便利,
但由於每個實例都沒有__dict__屬性,可以有效節省每個實例的內存消耗,有利於生成小而精。
做這件事的壹個例子。
4.新類添加了__getattribute__方法。
[python]查看純文本
A類(對象):
def __getattribute__(self,*args,**kwargs):
打印" A.__getattribute__ "
A1()類:
def __getattribute__(self,*args,**kwargs):
打印“A1。__getattribute__ "
a1 = A1()
a = A()
a .測試
打印" ========= "
a1 .測試
[python]查看純文本
A.__getattribute__
=========
回溯(最近壹次呼叫):
文件“t.py”,第18行,在& lt模塊& gt
a1 .測試
AttributeError: A1實例沒有屬性“test”
可以看出,A是壹個新類,每次通過實例訪問屬性都會通過__getattribute__函數。
A1不會調用__getattribute__,所以有錯誤。
Python 2.x默認是經典類,只有顯式繼承object才是新類。
Python 3.x默認是壹個新類,所以沒有必要顯式繼承object。