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

Python中__new__與__init__方法的區(qū)別詳解

 更新時(shí)間:2015年05月04日 09:25:03   投稿:goldensun  
這篇文章主要介紹了Python中__new__與__init__方法的區(qū)別,是Python學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下

在python2.x中,從object繼承得來的類稱為新式類(如class A(object))不從object繼承得來的類稱為經(jīng)典類(如class A())

新式類跟經(jīng)典類的差別主要是以下幾點(diǎn):

  1. 新式類對(duì)象可以直接通過__class__屬性獲取自身類型:type

  2. 繼承搜索的順序發(fā)生了改變,經(jīng)典類多繼承時(shí)屬性搜索順序: 先深入繼承樹左側(cè),再返回,開始找右側(cè)(即深度優(yōu)先搜索);新式類多繼承屬性搜索順序: 先水平搜索,然后再向上移動(dòng)

例子:

經(jīng)典類: 搜索順序是(D,B,A,C)

>>> class A: attr = 1
...
>>> class B(A): pass
...
>>> class C(A): attr = 2
...
>>> class D(B,C): pass
...
>>> x = D()
>>> x.attr
1

新式類繼承搜索程序是寬度優(yōu)先

新式類:搜索順序是(D,B,C,A)

>>> class A(object): attr = 1
...
>>> class B(A): pass
...
>>> class C(A): attr = 2
...
>>> class D(B,C): pass
...
>>> x = D()
>>> x.attr
2

  3. 新式類增加了__slots__內(nèi)置屬性, 可以把實(shí)例屬性的種類鎖定到__slots__規(guī)定的范圍之中。

  4. 新式類增加了__getattribute__方法

  5.新式類內(nèi)置有__new__方法而經(jīng)典類沒有__new__方法而只有__init__方法

注意:Python 2.x中默認(rèn)都是經(jīng)典類,只有顯式繼承了object才是新式類

     而Python 3.x中默認(rèn)都是新式類(也即object類默認(rèn)是所有類的祖先),不必顯式的繼承object(可以按照經(jīng)典類的定義方式寫一個(gè)經(jīng)典類并分別在python2.x和3.x版本中使用dir函數(shù)檢驗(yàn)下。

例如:

class A():

      pass

    print(dir(A))

會(huì)發(fā)現(xiàn)在2.x下沒有__new__方法而3.x下有。

接下來說下__new__方法和__init__的區(qū)別:

在python中創(chuàng)建類的一個(gè)實(shí)例時(shí),如果該類具有__new__方法,會(huì)先調(diào)用__new__方法,__new__方法接受當(dāng)前正在實(shí)例化的類作為第一個(gè)參數(shù)(這個(gè)參數(shù)的類型是type,這個(gè)類型在c和python的交互編程中具有重要的角色,感興趣的可以搜下相關(guān)的資料),其返回值是本次創(chuàng)建產(chǎn)生的實(shí)例,也就是我們熟知的__init__方法中的第一個(gè)參數(shù)self。那么就會(huì)有一個(gè)問題,這個(gè)實(shí)例怎么得到?

注意到有__new__方法的都是object類的后代,因此如果我們自己想要改寫__new__方法(注意不改寫時(shí)在創(chuàng)建實(shí)例的時(shí)候使用的是父類的__new__方法,如果父類沒有則繼續(xù)上溯)可以通過調(diào)用object的__new__方法類得到這個(gè)實(shí)例(這實(shí)際上也和python中的默認(rèn)機(jī)制基本一致),如:

class display(object):
  def __init__(self, *args, **kwargs):
    print("init")
  def __new__(cls, *args, **kwargs):
    print("new")
    print(type(cls))
    return object.__new__(cls, *args, **kwargs)  
a=display()

運(yùn)行上述代碼會(huì)得到如下輸出:

new

<class 'type'>

init

因此我們可以得到如下結(jié)論:

在實(shí)例創(chuàng)建過程中__new__方法先于__init__方法被調(diào)用,它的第一個(gè)參數(shù)類型為type。

如果不需要其它特殊的處理,可以使用object的__new__方法來得到創(chuàng)建的實(shí)例(也即self)。

于是我們可以發(fā)現(xiàn),實(shí)際上可以使用其它類的__new__方法類得到這個(gè)實(shí)例,只要那個(gè)類或其父類或祖先有__new__方法。

class another(object):
  def __new__(cls,*args,**kwargs):
    print("newano")
    return object.__new__(cls, *args, **kwargs)  
class display(object):
  def __init__(self, *args, **kwargs):
    print("init")
  def __new__(cls, *args, **kwargs):
    print("newdis")
    print(type(cls))
    return another.__new__(cls, *args, **kwargs)  
a=display()

上面的輸出是:

newdis
<class 'type'>
newano
init

所有我們發(fā)現(xiàn)__new__和__init__就像這么一個(gè)關(guān)系,__init__提供生產(chǎn)的原料self(但并不保證這個(gè)原料來源正宗,像上面那樣它用的是另一個(gè)不相關(guān)的類的__new__方法類得到這個(gè)實(shí)例),而__init__就用__new__給的原料來完善這個(gè)對(duì)象(盡管它不知道這些原料是不是正宗的)

相關(guān)文章

  • 使用pycharm運(yùn)行flask應(yīng)用程序的詳細(xì)教程

    使用pycharm運(yùn)行flask應(yīng)用程序的詳細(xì)教程

    這篇文章主要介紹了使用pycharm運(yùn)行flask應(yīng)用程序,首先大家需要使用pycharm創(chuàng)建你的第一個(gè)app,接下來就開始配置pycharm,需要的朋友可以參考下
    2021-06-06
  • Python利用PIL庫實(shí)現(xiàn)圖片轉(zhuǎn)Base64字符串的完整指南

    Python利用PIL庫實(shí)現(xiàn)圖片轉(zhuǎn)Base64字符串的完整指南

    這篇文章主要為大家詳細(xì)介紹了如何使用Python的PIL(Pillow)庫將圖像轉(zhuǎn)換為Base64編碼字符串,并提供多種實(shí)用場(chǎng)景的示例代碼,有需要的小伙伴可以了解下
    2026-01-01
  • Python3操作Excel文件(讀寫)的簡(jiǎn)單實(shí)例

    Python3操作Excel文件(讀寫)的簡(jiǎn)單實(shí)例

    這篇文章主要給大家介紹了關(guān)于Python3操作Excel文件(讀寫)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python3具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Pandas中時(shí)間序列的處理大全

    Pandas中時(shí)間序列的處理大全

    這篇文章主要給大家介紹了關(guān)于Pandas中時(shí)間序列處理的相關(guān)資料,pandas 是基于NumPy 的一種工具,該工具是為解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的,需要的朋友可以參考下
    2021-06-06
  • Python批量模糊匹配的3種方法實(shí)例

    Python批量模糊匹配的3種方法實(shí)例

    模糊匹配可以算是現(xiàn)代編輯器的一個(gè)必備特性了,它所做的就是根據(jù)用戶輸入的部分內(nèi)容,猜測(cè)用戶想要的文件名,并提供一個(gè)推薦列表供用戶選擇,下面這篇文章主要給大家介紹了關(guān)于Python批量模糊匹配的3種方法,需要的朋友可以參考下
    2022-03-03
  • pytorch中.numpy()、.item()、.cpu()、.detach()以及.data的使用方法

    pytorch中.numpy()、.item()、.cpu()、.detach()以及.data的使用方法

    這篇文章主要給大家介紹了關(guān)于pytorch中.numpy()、.item()、.cpu()、.detach()以及.data的使用方法,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-08-08
  • Python中異常處理用法

    Python中異常處理用法

    這篇文章主要給大家分享的是?Python中異常處理用法,為了保證程序的健壯性與容錯(cuò)性,即在遇到錯(cuò)誤時(shí)候程序不會(huì)崩潰,我們需要對(duì)異常進(jìn)行處理,下面來看看文章對(duì)此的用法,需要的朋友可以參考一下
    2021-11-11
  • 使用Python初始化多維列表遇到的問題詳解

    使用Python初始化多維列表遇到的問題詳解

    這篇文章主要介紹了使用Python初始化多維列表遇到的問題詳解,二維列表是將其他列表作為它的元素的列表,前一章介紹了如何使用一個(gè)列表來存儲(chǔ)線性的元素集合,可以使用列表來存儲(chǔ)二維數(shù)據(jù),需要的朋友可以參考下
    2023-11-11
  • Python爬蟲獲取基金凈值信息詳情

    Python爬蟲獲取基金凈值信息詳情

    這篇文章主要介紹了Python爬蟲獲取基金凈值信息詳情,文章基于錢兩篇文章的內(nèi)容圍繞python的相關(guān)資料展開詳細(xì)介紹,需要的小伙伴可以參考一下
    2022-05-05
  • python連接mongodb集群方法詳解

    python連接mongodb集群方法詳解

    這篇文章主要介紹了python連接mongo集群方法詳解,需要的朋友可以參考下
    2020-02-02

最新評(píng)論

合江县| 泾川县| 收藏| 定襄县| 江津市| 朝阳县| 舒城县| 封开县| 罗江县| 四会市| 广丰县| 容城县| 玛多县| 永靖县| 文化| 嵩明县| 榆中县| 南江县| 宜春市| 乌拉特中旗| 阆中市| 田阳县| 开化县| 赞皇县| 昆明市| 磐安县| 沧源| 宁陵县| 鄯善县| 兰溪市| 宾川县| 日照市| 陇南市| 万山特区| 景泰县| 大庆市| 志丹县| 沛县| 江安县| 达尔| 诸暨市|