国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

淺談python之新式類

2020-01-04 14:56:00
字體:
來源:轉載
供稿:網友

前言

本文中代碼運行的python版本一律采取2.7.13

科普:

經典類:classic class

新式類:new-style class

  1. python2.2 之前并沒有新式類
  2. python2.2-2.7 新式類與經典類并存, 默認使用經典類, 除非顯式繼承object
  3. python3.X 中去除了經典類, 用戶定義的所有類都隱式繼承自object

 如何使用新式類

 class New(object): # 顯式繼承object類 passclass Old:  pass  class Old2(): pass 

上述代碼中的3種定義類的方法, 只有第一種方法定義的是新式類.

新式類VS經典類 

新式類與經典類最主要的區別在于繼承順序, 事實上, 對于用戶定義的每一個類, python 都會計算出一個方法解析順序(Method Resolution Order, MRO)列表,它代表了類繼承的順序, 而由于經典類與新式類采用的算法不一致, 相同的繼承關系可能會出現不一樣的MRO列表.

import inspectclass D:  pass class C(D):  pass  class B(D):  pass class A(B, C):  pass  print inspect.getmro(A)# (<class __main__.A at 0x000000000322BB88>, # <class __main__.B at 0x000000000322B9A8>, # <class __main__.D at 0x000000000322BC48>, # <class __main__.C at 0x000000000322B948>)class D(object):  pass class C(D):  pass class B(D):  pass class A(B, C):  passprint inspect.getmro(A)# (<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <type 'object'>) 

可以看到, 經典類的MRO順序A-B-D-C 與新式類的MRO順序 A-B-C-D-object 是存在差異的, 這可能會是我們日常會遇到的坑.

而除了繼承順序的差異, 新式類還添加了內置屬性__slots__

一般來說, 每個實例都有一個字典來管理實例的屬性, 我們可以用__dict__ 來查看(__dict__并不保存類屬性),它允許我們動態地修改實例的屬性, 但是這也意味著每個實例都會有1個獨立的字典需要我們去維護, 當我們需要創建大量的實例時, 這個操作是十分消耗內存的.

當我們在定義類時添加了__slots__屬性后, 對象在實例化時就不會創建字典來管理實例屬性, 而實例只能定義在__slots__里邊已經設定好的屬性名, 不允許動態添加其他未在__slots__里定義的屬性

 class Student(object): __slots__ = ('id', 'name', 'gender') def exam(self):  passs1 = Student()'__dict__' in dir(s1) # Falses1.id = 10001s1.class = 1 # AttributeError: 'Student' object has no attribute 'class'def func(): passs1.exam = func # AttributeError: 'Student' object attribute 'f' is read-only

使用__slots__ 后我們不再能夠動態地修改實例的屬性, 那么使用__slots__究竟有什么好處呢?

優點:
 1.節省內存
 2.提高屬性訪問速度

缺點:
 1.不能動態修改實例屬性

當然, 除了繼承順序和__slots__, 新式類添加了__getattribute__方法, 還修改了實例的類型

 class New(object): pass class Old: pass new = New()old = Old()print(new)# <__main__.New object at 0x0000000003262208>print(old)# <__main__.Old instance at 0x000000000321C6C8>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 巴青县| 沅陵县| 镇原县| 潢川县| 达拉特旗| 北碚区| 枝江市| 蕲春县| 平和县| 双桥区| 乐至县| 凌云县| 武鸣县| 方城县| 延吉市| 肥东县| 大兴区| 德兴市| 乐东| 连云港市| 丘北县| 成安县| 晋江市| 栾城县| 邢台市| 扎赉特旗| 霞浦县| 秭归县| 宝清县| 台州市| 白沙| 安阳县| 肇东市| 会理县| 龙游县| 永州市| 会泽县| 邛崃市| 中山市| 中江县| 东丰县|