python 經典類和新式類

DAY 12. python新式類和舊式類

繼承自object基類的類叫做新式類,否則叫做舊式類,python3中的類默認是新式類,之前版本默認是舊式類

root@kail:~# python
python 2.7.15 (default,Jul 28 2018,11:29:29)
[GCC 8.1.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class A():
...     pass
...
>>> a=A()
>>> dir(a)
['__doc__','__module__']

如上,在python2中定義一個類,不繼承任何基類,內建屬性只有兩個,這就是舊式類,如果想要創建一個新式類,需要顯式的繼承object基類,如:

root@kail:~# python
python 2.7.15 (default,Jul 28 2018,11:29:29)
[GCC 8.1.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class A(object):
...     pass
...
>>> dir(A)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

新式類默認有很多屬性,都是從object基類中繼承過來的,而在python3中所有類默認繼承object基類

Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> class A:pass
>>> dir(A)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
>>>

每個屬性的具體用法參見Python——特殊屬性與方法

12.1 新式類和舊式類的區別

  1. 根本區別:新式類繼承自object基類,舊式類不繼承任何基類
  2. MRO不同:新式類和經典類的方法解析順序(MRO)不同,經典類使用DFS,新式類使用C3算法

python 2.7

class A():name = 'A'age = 12class B():name = 'B'class C():name = 'C'class D(A,B):name = 'D'class E(A,C):name = 'E'age = 13class F(D,E):passprint F.name  # D
print F.age  # 12

上面的繼承關系是:

A,age=12
D
B
A
E,age=13
C
F

顯然在age的繼承上,2.7使用了DFS,我們再看3.7

python 3.7

class A():name = 'A'age = 12class B():name = 'B'class C():name = 'C'class D(A,B):name = 'D'class E(A,C):name = 'E'age = 13class F(D,E):passprint(F.name)  # D
print(F.age)  # 13

顯然3.7沒有使用DFS,而是在每一次尋找入度為零的節點,加入mro列表后刪除這條邊,再次尋找,以上面的代碼為例,第一個入讀為0的節點就是F,所以mro表的第一項就是F,刪除F及相連的邊,入度為0的就是DE,按照書寫代碼的順序第二項為D,第三項為E,依次,最終所有新式類繼承自object,所以最后一項就是object,繼承順序就是按mro列表的順序來的,可以使用mro()查看mro列表

print(F.mro())
# [<class '__main__.F'>, <class '__main__.D'>, <class '__main__.E'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>]

也就是說,C3是先在水平方向上查找,再往上查找

12.2 總結

基類MRO備注
經典類NoneDFSpython2默認經典類
新式類objectC3python3默認新式類

我嘗試在python3中通過重寫type元類寫出經典類,但發現這樣寫出的類似乎不是真的經典類,只是默認屬性和經典類差不多,MRO行為依舊和新式類一樣,可能是我代碼有問題,請各位大佬賜教

class Type(type):__bases__ = ()__base__ = None__mro__ = (None,)Foo1 = Type('Foo1',() ,{})
Foo2 = Type('Foo2', (), {})
Foo3 = Type('Foo3', (), {})
Foo4 = Type('Foo4', (Foo1, Foo2), {})
Foo5 = Type('Foo5', (Foo1, Foo3), {})
Foo6 = Type('Foo6', (Foo4, Foo5), {})if __name__ == '__main__':# base 為空時會多出兩個屬性,第一個與類描述有關,第二個與弱拷貝有關print(dir(Foo1))  # ['__dict__', '__doc__', '__module__', '__weakref__']print(dir(Foo2))  # ['__dict__', '__doc__', '__module__', '__weakref__']print(dir(Foo3))  # ['__dict__', '__doc__', '__module__', '__weakref__']# base 不為空時,默認屬性表現的和經典類一樣print(dir(Foo4))  # ['__doc__', '__module__']print(dir(Foo5))  # ['__doc__', '__module__']print(dir(Foo6))  # ['__doc__', '__module__']# 假如定義的是經典類,這里應該不能調用mro方法,但這里調用了,說明本身就不對,并且mro列表最后是object,進一步說明這還是一個新式類print(Foo1.mro())  # [<class '__main__.Foo1'>, <class 'object'>]print(Foo2.mro())  # [<class '__main__.Foo1'>, <class 'object'>]print(Foo3.mro())  # [<class '__main__.Foo1'>, <class 'object'>]print(Foo4.mro())  # [<class '__main__.Foo4'>, <class '__main__.Foo1'>, <class '__main__.Foo2'>, <class 'object'>]print(Foo5.mro())  # [<class '__main__.Foo5'>, <class '__main__.Foo1'>, <class '__main__.Foo3'>, <class 'object'>]# 清楚的看到MRO使用的是C3算法print(Foo6.mro())  # [<class '__main__.Foo6'>, <class '__main__.Foo4'>, <class '__main__.Foo5'>, <class '__main__.Foo1'>, <class '__main__.Foo2'>, <class '__main__.Foo3'>, <class 'object'>]# TODO: 如何在python3中定義經典類,還是根本不能定義,拋磚引玉,請賜教

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457573.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457573.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457573.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Why does pthread_cond_signal not work?【轉】

轉自&#xff1a;http://stackoverflow.com/questions/16819169/why-does-pthread-cond-signal-not-work# 0 down vote favorite I am currently learing all around POSIX threads (pthread). I now have created a simple program which increased a shared value by 7 until…

Android開發技術周報 Issue#72

新聞 Android N 最初預覽版&#xff1a;開發者 API 和工具教程 Gradle依賴的統一管理 理解Java垃圾回收機制 淺談 Android 編程思想和架構 由Android 65K方法數限制引發的思考 Android音頻開發&#xff08;1&#xff09;&#xff1a;基礎知識 Android音頻開發&#xff08;…

python 單例模式的四種實現方法

DAY 13. 單例設計 13.1 什么是單例設計 一個類每次實例化返回的都是同一個對象&#xff0c;這種設計模式叫做單例設計&#xff0c;這個類叫做單例類 13.2 實現單例設計的方法 13.2.1 重寫__new__() class Foo:def __new__(cls,*args, **kwargs):# 如果是第一次實例化&…

Redis3.2.5部署(單節點)

1.安裝jdk1.8 [rootsht-logstash-01 ~]# cd /usr/java/ [rootsht-logstash-01 java]# wget --no-check-certificate --no-cookies --header "Cookie: oraclelicenseaccept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u111-b14/jdk-8u111…

字節跳動 設計模式 pdf_憑這份pdf我拿下了美團、字節跳動、阿里、小米等大廠的offer...

關于程序員&#xff0c;除了做項目來提高自身的技術之外&#xff0c;還有一種提升自己的專業技能就是&#xff1a;多&#xff01;看&#xff01;書&#xff01;小編整理出一篇Java進階架構師之路的核心知識&#xff0c;同時也是面試時面試官必問的知識點&#xff0c;篇章也是包…

B. One Bomb (#363 Div.2)

B. One Bombtime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputYou are given a description of a depot. It is a rectangular checkered field of n??m size. Each cell in a field can be empty (".") or…

力扣交替打印FooBar

這道題要注意的是兩個線程喚醒和等待的順序&#xff0c;應為第一個線程會比第二個線程更早結束&#xff0c;所以如果第一個線程已經結束&#xff0c;而第二個線程還在等待被喚醒&#xff0c;那第二個線程會一直等待下去&#xff0c;因此第一個線程要先等待后喚醒&#xff0c;這…

項目開發容易出錯情況統計

2016年11月17日 11:30:45 星期四 1.適配&#xff1a; a) APP彈窗大屏幕適配&#xff08;例如&#xff0c; 是否居中&#xff09; 2.按鈕狀態&#xff1a; a) 按鈕點擊后沒有disable 如果新頁面加載卡頓導致用戶多次點擊&#xff0c;生成多次請求 b) 按鈕disable后什么時候enabl…

python會不會出4_無極4網人生苦短,Python會不會被取代?國外網友

本文經AI新媒體量子位(公眾號ID:QbitAI)授權轉載&#xff0c;轉載請聯系出處。人生苦短&#xff0c;我該不該選擇Python&#xff1f;編程語言幾年一變樣&#xff0c;榜單之爭也是愈演愈烈&#xff0c;還架不住時不時殺出個黑馬……而對于Python&#xff0c;自2010年初以來一直蓬…

android 音頻播放總結 soundlPool,MediaPlay

soundlPool 用于小音頻的播放多個同時播放。 使用步驟&#xff1a; 步驟一&#xff1a; 首先下載音頻文件可以將其放入assets文件夾下或者res下的raw文件夾下&#xff0c;區別在于assets下可以再新建文件夾而raw不行&#xff0c;assets內部單個文件超過1m時可能存在bug而raw不會…

文本分析軟件_十大針對機器學習的文本注釋工具與服務,你選哪個?

房地產和鍵【51CTO.com快譯】目前&#xff0c;從搜索引擎與情感分析&#xff0c;到虛擬助手與聊天機器人&#xff0c;機器學習應用場景中的許多研究領域&#xff0c;都需要通過文本注釋工具與服務來提供準確性。在AI研究與開發行業中&#xff0c;發現或創建可注釋的數據對于項目…

sqlite創建表

create table bike (id varchar(6) primary key, password char(6));

python 垃圾回收機制

DAY 18. python垃圾回收機制 python GC主要有三種方式 引用計數標記清除分代回收 其中&#xff0c;以引用計數為主。 18.1 引用計數&#xff08;Reference Counting&#xff09; 《尋夢環游記》中說&#xff0c;人一生會經歷兩次死亡&#xff0c;一次是肉體死的時候&#…

曲線連接線_荷重位移曲線儀操作使用注意事項-荷重位移曲線儀廠家

荷重位移曲線儀廣泛適用于各種按鍵及開關、DOME片、按鍵、微力彈片、硅膠按鍵、汽車開關之荷重-行程測定&#xff1b;Windows中英文雙語軟件&#xff0c;操作簡單方便&#xff0c;軟件流暢穩定&#xff0c;所有測試資料(測試條件&#xff0c;曲線&#xff0c;數據結果&#xff…

進程調度

1、策略 策略決定調度程序在何時讓什么進程運行。調度器的策略往往決定系統的整體印象&#xff0c;并且&#xff0c;還要負責優化使用處理器時間。 1.1 I/o消耗型和處理器消耗型。 進程可以被分為I/O消耗型和處理器消耗型。前者指進程的大部分時間用來提交I/O請求或者等待I/O請…

Django,Ajax,Vue實現文章評論功能

Django評論 評論復雜的地方在于需要實現點擊提交評論后評論內容需要立刻出現在下面&#xff0c;還要保持頁面位置不變&#xff0c;所以提交后不能整體刷新頁面&#xff0c;因為刷新以后頁面肯定在最上面&#xff0c;而評論一般都在最下面&#xff0c;所以要用到Ajax 整個過程用…

回歸分析什么時候取對數_冬蜜什么時候取,冬天取蜂蜜的方法

大家好&#xff0c;我現在分享的是&#xff0c;在冬天是在什么時候取蜜&#xff01;冬天在我們南方&#xff0c;取蜜時間是十一月到十二月的時候&#xff0c;只要溫度達到15度以上&#xff0c;蜂蜜封蓋了就可以取蜜了&#xff0c;并且在冬天我們只能取一次&#xff0c;最晚取蜜…

Opencv與dlib聯合進行人臉關鍵點檢測與識別

前言 依賴庫&#xff1a;opencv 2.4.9 /dlib 19.0/libfacedetection 本篇不記錄如何配置&#xff0c;重點在實現上。使用libfacedetection實現人臉區域檢測&#xff0c;聯合dlib標記人臉特征點&#xff0c;最后使用opencv的FaceRecognizer實現人臉識別。 準備工作 1、配置好Op…

Category 的一些事

來源&#xff1a;伯樂在線 - Tsui YuenHong 鏈接&#xff1a;http://ios.jobbole.com/90422/ 點擊 → 申請加入伯樂在線專欄作者 新增實踐部分&#xff1a;偏方 Hook 進某些方法來添加功能 Category – 簡介 Category&#xff08;類別&#xff09;是 Objective-C 2.0 添加的新特…

python tfidf特征變換_機器學習的“萬能模板” - 數據分析

最后是文本變量。很遺憾Titanic數據集中沒有合適的文本變量。一般我們處理文本變量的方法是&#xff0c;合并所有的文本形成一個變量&#xff0c;然后調用Count Vectorizer或者TfidfVectorizer算法&#xff0c;將文本數據轉換成數字。大部分情況下&#xff0c;TfidfVectorizer比…