日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 经典类和新式类

發布時間:2023/12/20 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 新式類和舊式類的區別

  • 根本區別:新式類繼承自object基類,舊式類不繼承任何基類
  • 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=12DBAE,age=13CF

    顯然在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中定義經典類,還是根本不能定義,拋磚引玉,請賜教

    總結

    以上是生活随笔為你收集整理的python 经典类和新式类的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 91超碰免费在线 | 不许穿内裤随时挨c调教h苏绵 | 亚洲免费一区 | 天天色天天搞 | 亚洲福利网站 | 99视频一区 | 伊人丁香| 成人wwwww免费观看 | 中国肥胖女人真人毛片 | 天天爽夜夜操 | 男男全肉变态重口高h | 国产香蕉精品 | 夜夜草影院 | 在线免费观看www | 国产一级片免费视频 | 国产一区亚洲二区三区 | julia一区二区中文久久97 | 亚洲欧美伊人 | 亚洲第一精品网站 | 先锋av资源网站 | 亚洲一区二区中文 | 中国美女黄色一级片 | 国产精品第十页 | 亚洲国产精品久久久久爰性色 | 一区二区视频国产 | 国产超碰人人 | 欧美一区二区视频免费观看 | 亚洲开心网 | 日日夜夜国产 | 国产一线二线三线在线观看 | 淫语视频| 国产一级一级国产 | 波多野吉衣毛片 | 久久狠 | 欧美男女交配 | 天天av综合 | 靠逼视频网站 | 91爱| aaa国产 | 北条麻妃99精品青青久久 | 日本妈妈3| 日本在线小视频 | 性爱免费在线视频 | av网站免费在线 | a免费毛片| 女人被狂躁c到高潮喷水电影 | 国产无遮挡免费观看视频网站 | 免费视频爱爱太爽 | 秋霞伦理一区二区 | 桃色成人网| 欧美激情视频网站 | 中文字幕日韩有码 | 啪啪中文字幕 | jizz国产免费 | 午夜成年人视频 | 91在线最新 | 欧美一区二区 | 国内精品在线播放 | 男人的天堂网av | 亚洲精品国产精品国自产 | 男生插女生视频在线观看 | 69综合| 少妇偷人精品无码人妻 | 香蕉视频网站在线观看 | 欧美日韩国产一区二区 | 国产人妻互换一区二区 | 欧美日韩麻豆 | 国产aaa毛片 | 麻豆 国产 | 欧美日韩一区二区区别是什么 | 少妇第一次交换又紧又爽 | 欧美性猛交xxxx乱大交3 | 中文字幕精品久久久久人妻红杏ⅰ | 天天做天天看 | 一级片播放 | 九色porn蝌蚪| 国模大胆一区二区三区 | 国产91在线精品 | 公侵犯人妻中文字慕一区二区 | 欧美成人一区二区视频 | 国产一区免费在线观看 | 国产又黄又猛 | 人人人插| 日韩综合久久 | 亚洲色图 美腿丝袜 | 东北毛片 | 911香蕉| 免费观看成人 | 美女被叉叉的影院 | 日韩精品高清在线观看 | 产乳奶汁h文1v1 | www.4hu95.com四虎| 夜夜视频 | av大片网址 | 国产99在线 | 韩国午夜影院 | 苏晴忘穿内裤坐公交车被揉到视频 | 久久密av| 亚洲综合性 |