當前位置:成語大全網 - 書法字典 - Python新類和經典類的區別

Python新類和經典類的區別

新的類對象可以通過__class__ attribute: type直接獲取自己的類型。

[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。