亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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列表并遵循如下三條準則:

  • 子類會先于父類被檢查
  • 多個父類會根據(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里使用正則表達式的組嵌套實例詳解

    python里使用正則表達式的組嵌套實例詳解

    這篇文章主要介紹了python里使用正則表達式的組嵌套實例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-10-10
  • python中pygame安裝不成功的解決辦法

    python中pygame安裝不成功的解決辦法

    盡管網(wǎng)上搜到許多篇關(guān)于pycharm如何安裝pygame庫,但是跟著要求做還是安裝失敗,下面這篇文章主要給大家介紹了關(guān)于python中pygame安裝不成功的解決辦法,需要的朋友可以參考下
    2023-05-05
  • Qt5.14 與 OpenCV4.5 教程之圖片增強效果

    Qt5.14 與 OpenCV4.5 教程之圖片增強效果

    這篇文章主要介紹了Qt5.14 與 OpenCV4.5 教程之圖片增強效果的實現(xiàn),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-11-11
  • Python實踐之使用Pandas進行數(shù)據(jù)分析

    Python實踐之使用Pandas進行數(shù)據(jù)分析

    在數(shù)據(jù)分析領(lǐng)域,Python的Pandas庫是一個非常強大的工具。這篇文章將為大家詳細介紹如何使用Pandas進行數(shù)據(jù)分析,希望對大家有所幫助
    2023-04-04
  • django中的自定義分頁器的實現(xiàn)示例

    django中的自定義分頁器的實現(xiàn)示例

    本文主要介紹了django中的自定義分頁器的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Python數(shù)據(jù)預(yù)處理常用的5個技巧

    Python數(shù)據(jù)預(yù)處理常用的5個技巧

    大家好,本篇文章主要講的是Python數(shù)據(jù)預(yù)處理常用的5個技巧,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • python list轉(zhuǎn)dict示例分享

    python list轉(zhuǎn)dict示例分享

    這篇文章主要介紹了python list轉(zhuǎn)dict的使用方法,大家參考使用吧
    2014-01-01
  • Python二進制文件讀取并轉(zhuǎn)換為浮點數(shù)詳解

    Python二進制文件讀取并轉(zhuǎn)換為浮點數(shù)詳解

    這篇文章主要介紹了Python二進制文件讀取并轉(zhuǎn)換為浮點數(shù)詳解,用python讀取二進制文件,這里主要用到struct包,而這個包里面的方法主要是unpack、pack、calcsize。,需要的朋友可以參考下
    2019-06-06
  • Python中atexit模塊的基本使用示例

    Python中atexit模塊的基本使用示例

    這篇文章主要介紹了Python中atexit模塊的基本使用示例,示例代碼基于Python2.x版本,注意其和Python3的兼容性,需要的朋友可以參考下
    2015-07-07
  • python中裝飾器級連的使用方法示例

    python中裝飾器級連的使用方法示例

    裝飾器本質(zhì)上是一個Python函數(shù),它可以讓其他函數(shù)在不需要做任何代碼變動的前提下增加額外功能,下面這篇文章主要給大家介紹了關(guān)于python中裝飾器級連的使用方法,需要的朋友可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09

最新評論