最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python super的使用方法及實例詳解

 更新時間:2019年09月25日 11:28:49   投稿:yaominghui  
這篇文章主要介紹了python super的使用方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

功能

super功能:super函數(shù)是子類用于調(diào)用父類(超類)的一個方法。

用法

1.在子類 __init__() 方法中正確的初始化父類,保證相同的基類只初始化一次。

2.覆蓋特殊方法。

3.解決多重繼承中,子類重復(fù)調(diào)用父類方法的問題。

注意

super()繼承只能用于新式類,用于經(jīng)典類時就會報錯。

新式類:必須有繼承的類,如果無繼承的,則繼承object

經(jīng)典類:沒有父類,如果此時調(diào)用super就會出現(xiàn)錯誤:『super() argument 1 must be type, not classobj)

在子類__init__()方法中正確初始化父類,保證相同的基類只初始化一次

假如說在父類中實現(xiàn)了一個方法,你想在子類中使用父類的這個方法并且做一定擴展但是又不想完全重寫,并且這個場景中的繼承屬于多繼承,那么super()就出場了,可以實現(xiàn)方法的增量修改。

A(父類)有x屬性,B(子類)想添加y屬性:

class A(object):
  def __init__(self,x):
    self.x = x
class B(A):
  def __init__(self,x,y):
    super(B,self,).__init__(x)
    self.y = y
a = A(2)
b = B(2,4)
print(a.x)
print(b.x,b.y)

覆蓋Python特殊方法

class Proxy:
  def __init__(self, obj):
    self._obj = obj

  # Delegate attribute lookup to internal obj
  def __getattr__(self, name):
    return getattr(self._obj, name)

  # Delegate attribute assignment
  def __setattr__(self, name, value):
    if name.startswith('_'):
      super().__setattr__(name, value) # Call original __setattr__
    else:
      setattr(self._obj, name, value)

在上面代碼中,__setattr__() 的實現(xiàn)包含一個名字檢查。 如果某個屬性名以下劃線(_)開頭,就通過 super() 調(diào)用原始的 __setattr__() , 否則的話就委派給內(nèi)部的代理對象 self._obj 去處理。 這看上去有點意思,因為就算沒有顯式的指明某個類的父類, super() 仍然可以有效的工作。

解決多重繼承中,子類重復(fù)調(diào)用父類方法的問題

class Base:
  def __init__(self):
    print('Base.__init__')
class A(Base):
  def __init__(self):
    Base.__init__(self)
    print('A.__init__')

盡管對于大部分代碼而言這么做沒什么問題,但是在更復(fù)雜的涉及到多繼承的代碼中就有可能導(dǎo)致很奇怪的問題發(fā)生。 比如,考慮如下的情況:

class Base:
  def __init__(self):
    print('Base.__init__')

class A(Base):
  def __init__(self):
    Base.__init__(self)
    print('A.__init__')

class B(Base):
  def __init__(self):
    Base.__init__(self)
    print('B.__init__')

class C(A,B):
  def __init__(self):
    A.__init__(self)
    B.__init__(self)
    print('C.__init__')

如果你運行這段代碼就會發(fā)現(xiàn) Base.__init__() 被調(diào)用兩次,如下所示:

>>> c = C()
Base.__init__
A.__init__
Base.__init__
B.__init__
C.__init__
>>>

可能兩次調(diào)用 Base.__init__() 沒什么壞處,但有時候卻不是。 另一方面,假設(shè)你在代碼中換成使用 super() ,結(jié)果就很完美了:

class Base:
  def __init__(self):
    print('Base.__init__')
class A(Base):
  def __init__(self):
    super().__init__()
    print('A.__init__')

class B(Base):
  def __init__(self):
    super().__init__()
    print('B.__init__')

class C(A,B):
  def __init__(self):
    super().__init__() # Only one call to super() here
    print('C.__init__')

運行這個新版本后,你會發(fā)現(xiàn)每個 __init__() 方法只會被調(diào)用一次了:

>>> c = C()
Base.__init__
B.__init__
A.__init__
C.__init__
>>>

為了弄清它的原理,我們需要花點時間解釋下Python是如何實現(xiàn)繼承的。 對于你定義的每一個類,Python會計算出一個所謂的方法解析順序(MRO)列表。 這個MRO列表就是一個簡單的所有基類的線性順序表。例如:

>>> C.__mro__
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>,
<class '__main__.Base'>, <class 'object'>)
>>>

為了實現(xiàn)繼承,Python會在MRO列表上從左到右開始查找基類,直到找到第一個匹配這個屬性的類為止。

而這個MRO列表的構(gòu)造是通過一個C3線性化算法來實現(xiàn)的。 我們不去深究這個算法的數(shù)學(xué)原理,它實際上就是合并所有父類的MRO列表并遵循如下三條準(zhǔn)則:

  • 子類會先于父類被檢查
  • 多個父類會根據(jù)它們在列表中的順序被檢查
  • 如果對下一個類存在兩個合法的選擇,選擇第一個父類

老實說,你所要知道的就是MRO列表中的類順序會讓你定義的任意類層級關(guān)系變得有意義。

當(dāng)你使用 super() 函數(shù)時,Python會在MRO列表上繼續(xù)搜索下一個類。 只要每個重定義的方法統(tǒng)一使用 super() 并只調(diào)用它一次, 那么控制流最終會遍歷完整個MRO列表,每個方法也只會被調(diào)用一次。 這也是為什么在第二個例子中你不會調(diào)用兩次 Base.__init__() 的原因。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python中break、continue 、exit() 、pass終止循環(huán)的區(qū)別詳解

    python中break、continue 、exit() 、pass終止循環(huán)的區(qū)別詳解

    這篇文章主要介紹了python中break、continue 、exit() 、pass終止循環(huán)的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Pycharm中的下載安裝、配置與測試方式

    Pycharm中的下載安裝、配置與測試方式

    這篇文章主要介紹了Pycharm中的下載安裝、配置與測試方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • python如何生成密碼字典

    python如何生成密碼字典

    這篇文章主要介紹了python如何生成密碼字典,密碼字典主要是配合解密使用,下面利用python實現(xiàn)生成密碼字典,需要的小伙伴可以參考一下
    2022-03-03
  • Python 從一個文件中調(diào)用另一個文件的類方法

    Python 從一個文件中調(diào)用另一個文件的類方法

    今天小編就為大家分享一篇Python 從一個文件中調(diào)用另一個文件的類方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python使用Web框架Flask開發(fā)項目

    Python使用Web框架Flask開發(fā)項目

    本文詳細講解了Python使用Web框架Flask開發(fā)項目的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • 如何在 Django 模板中輸出

    如何在 Django 模板中輸出 "{{"

    這篇文章主要介紹了如何在 Django 模板中輸出 "{{" ,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • python3中property使用方法詳解

    python3中property使用方法詳解

    這篇文章主要為大家詳細介紹了python3中的property使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • 使用ChatGPT進行Abaqus二次開發(fā)詳解

    使用ChatGPT進行Abaqus二次開發(fā)詳解

    這篇文章主要為大家介紹了使用ChatGPT進行Abaqus二次開發(fā)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Python實現(xiàn)自動化表單填寫功能

    Python實現(xiàn)自動化表單填寫功能

    在Python中,自動化表單填寫可以通過多種庫和工具實現(xiàn),本文將詳細介紹常用的自動化表單處理工具,并對它們進行橫向比較,可根據(jù)需求選擇合適的工具,感興趣的小伙伴跟著小編一起來看看吧
    2025-03-03
  • python 數(shù)據(jù)加密代碼

    python 數(shù)據(jù)加密代碼

    使用Python來做數(shù)據(jù)加密同樣簡單,可以使用hashlib或者hmac模塊來做數(shù)據(jù)加密
    2008-12-12

最新評論

卢湾区| 淳安县| 闸北区| 崇仁县| 闸北区| 香港| 封开县| 广德县| 张北县| 湘阴县| 疏勒县| 横峰县| 新巴尔虎左旗| 左贡县| 通化县| 浮山县| 台北市| 甘泉县| 扶沟县| 上饶市| 泽州县| 大关县| 黑河市| 隆子县| 库伦旗| 贵定县| 台江县| 修武县| 普洱| 同德县| 休宁县| 疏附县| 娄底市| 通化县| 随州市| 安多县| 东光县| 靖江市| 广水市| 张掖市| 朔州市|