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

Python中的__new__與__init__魔術(shù)方法理解筆記

 更新時(shí)間:2014年11月08日 13:13:15   投稿:junjie  
這篇文章主要介紹了Python中的__new__與__init__魔術(shù)方法理解筆記,需要的朋友可以參考下

很喜歡Python這門語言。在看過語法后學(xué)習(xí)了Django 這個(gè) Web 開發(fā)框架。算是對(duì) Python 有些熟悉了。不過對(duì)里面很多東西還是不知道,因?yàn)橛玫纳?。今天學(xué)習(xí)了兩個(gè)魔術(shù)方法:__new__ 和 __init__。

開攻:

如果對(duì) Python 有所簡單了解的話應(yīng)該知道它包含類這個(gè)概念的。語法如下:

復(fù)制代碼 代碼如下:

class ClassName:
    <statement - 1>:
        .
        .  
        .
    <statement - N>

問題來了。像我們學(xué)習(xí)的 C# 或是 Java 這些語言中,聲明類時(shí),都是有構(gòu)造函數(shù)的。類似下面這樣子:

復(fù)制代碼 代碼如下:

public class ClassName{
    public ClassName(){

    }
}

當(dāng)然訪問修飾符不一定非得 public ,這不是重點(diǎn)就不啰嗦了。那 Python 中的構(gòu)造函數(shù)是怎樣的呢?我自己的理解是它是沒有構(gòu)造函數(shù)的。只不過在初始化時(shí)會(huì)調(diào)用一些內(nèi)部的可被改變的方法。比如:__new__ 和 __init__ 。從字面意思理解 __new__ 應(yīng)該會(huì)在 __init__ 之前執(zhí)行,實(shí)際查了資料后確實(shí)是如此的。官方文檔中關(guān)于 __init__ 方法有這樣一句話:

復(fù)制代碼 代碼如下:

Many classes like to create objects with instances customized to a specific initial state. Therefore a class may define a special method named __init__()

意思就是說在創(chuàng)建類時(shí),如果想指定的它的初始狀態(tài),那么可以通過定義一個(gè)指定名稱為 __init__ 的方法去實(shí)現(xiàn)這樣的功能。這樣說來 __new__ 并不是官方推薦的初始化類時(shí)要使用的方法。但是 __new__ 卻是在 __init__ 之前執(zhí)行的。官方文檔中對(duì) __init__ 介紹的第一句便是:當(dāng)創(chuàng)建實(shí)例時(shí)調(diào)用 __init__ 方法(Called when the instance is created.),后面又介紹說,如果想調(diào)用基類的 __init__方法必須顯式的調(diào)用,只繼承基類在初始化子類時(shí)并不會(huì)自動(dòng)調(diào)用基類的 __init__ 方法。到此應(yīng)該算是對(duì) __init__ 方法了解了。

下面我們看一下 __new__ 方法是怎么回事兒。先看一下官方文檔:

復(fù)制代碼 代碼如下:

Called to create a new instance of class cls. __new__() is a static method (special-cased so you need not declare it as such) that takes the class of which an instance was requested as its first argument. The remaining arguments are those passed to the object constructor expression (the call to the class). The return value of __new__() should be the new object instance (usually an instance of cls).

Typical implementations create a new instance of the class by invoking the superclass's __new__() method using super(currentclass, cls).__new__(cls[, ...]) with appropriate arguments and then modifying the newly-created instance as necessary before returning it.

If __new__() returns an instance of cls, then the new instance's __init__() method will be invoked like __init__(self[, ...]), where self is the new instance and the remaining arguments are the same as were passed to __new__().

If __new__() does not return an instance of cls, then the new instance's __init__() method will not be invoked.

__new__() is intended mainly to allow subclasses of immutable types (like int, str, or tuple) to customize instance creation. It is also commonly overridden in custom metaclasses in order to customize class creation.

從這里可以看出來,這個(gè)方法才是產(chǎn)生類的實(shí)例的地方。當(dāng)實(shí)例創(chuàng)建完成就調(diào)用 __init__ 方法,初始化類的內(nèi)部狀態(tài)值。文檔中還提到 __new__ 方法其實(shí)是一個(gè)靜態(tài)方法,不用每次定義類的時(shí)候都聲明這個(gè)方法,因?yàn)樵诎姹?2.4 之后 object 是所有對(duì)象的基類,而 __new__ 是定義在 object 對(duì)象內(nèi)部的靜態(tài)方法。

到這兒其實(shí)就差不多了,就按字面意思理解就可以。 __new__ 用于創(chuàng)建對(duì)象,而 __init__ 是在創(chuàng)建完成之后初始化對(duì)象狀態(tài)。前兩天看到一個(gè)有趣的方法,通過使用 __new__ 應(yīng)用了單例模式在對(duì)象身上。

注意點(diǎn):在類繼承中,當(dāng)子類和父類都定義了自己的 __new__ 方法時(shí),那么會(huì)先調(diào)用子類的 __new__ 方法再調(diào)用父類的。這一點(diǎn)倒是和 C# 中的繼承是一樣的。其實(shí)仔細(xì)想想 Python 中只不過是把初始化和創(chuàng)建對(duì)象這兩個(gè)概念分開了,而 C# 中即沒有這么干,只給了構(gòu)造函數(shù),開發(fā)者可以自己看著辦。從這一點(diǎn)兒上說我覺得 Python 的做法我更喜歡。

結(jié)束:

今天算是又學(xué)習(xí)到了新知識(shí),自己挺開心的。再實(shí)踐實(shí)踐。。。

相關(guān)文章

  • 想學(xué)畫畫?python滿足你!

    想學(xué)畫畫?python滿足你!

    這篇文章主要介紹了如何利用python畫畫,幫助大家更好的理解和使用python的turtle庫,感興趣的朋友可以了解下
    2020-12-12
  • Python高級(jí)特性與幾種函數(shù)的講解

    Python高級(jí)特性與幾種函數(shù)的講解

    今天小編就為大家分享一篇關(guān)于Python高級(jí)特性與幾種函數(shù)的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Python讀寫鎖實(shí)現(xiàn)實(shí)現(xiàn)代碼解析

    Python讀寫鎖實(shí)現(xiàn)實(shí)現(xiàn)代碼解析

    這篇文章主要介紹了Python讀寫鎖實(shí)現(xiàn)實(shí)現(xiàn)代碼解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • python3+selenium實(shí)現(xiàn)126郵箱登陸并發(fā)送郵件功能

    python3+selenium實(shí)現(xiàn)126郵箱登陸并發(fā)送郵件功能

    這篇文章主要為大家詳細(xì)介紹了python3+selenium實(shí)現(xiàn)126郵箱登陸并發(fā)送郵件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 詳解python的循環(huán)

    詳解python的循環(huán)

    這篇文章主要為大家介紹了python的循環(huán),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • 詳解在Python中創(chuàng)建條形圖追趕動(dòng)畫

    詳解在Python中創(chuàng)建條形圖追趕動(dòng)畫

    動(dòng)畫是使可視化更具吸引力和用戶吸引力的好方法。它幫助我們以有意義的方式展示數(shù)據(jù)可視化。Matplotlib是一個(gè)非常流行的數(shù)據(jù)可視化庫,通常用于數(shù)據(jù)的圖形表示以及使用內(nèi)置函數(shù)的動(dòng)畫。本文將用Matplotlib繪制條形圖追趕動(dòng)畫,需要的可以參考一下
    2022-03-03
  • 解決nohup重定向python輸出到文件不成功的問題

    解決nohup重定向python輸出到文件不成功的問題

    今天小編就為大家分享一篇解決nohup重定向python輸出到文件不成功的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Python如何快速生成本項(xiàng)目的requeirments.txt實(shí)現(xiàn)

    Python如何快速生成本項(xiàng)目的requeirments.txt實(shí)現(xiàn)

    本文主要介紹了Python如何快速生成本項(xiàng)目的requeirments.txt實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Python大批量寫入數(shù)據(jù)(百萬級(jí)別)的方法

    Python大批量寫入數(shù)據(jù)(百萬級(jí)別)的方法

    這篇文章主要給大家介紹了關(guān)于Python大批量寫入數(shù)據(jù)(百萬級(jí)別)的相關(guān)資料,在日常處理數(shù)據(jù)的過程中,我們都有批量寫入數(shù)據(jù)的需求,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考下
    2023-07-07
  • python3 讀取Excel表格中的數(shù)據(jù)

    python3 讀取Excel表格中的數(shù)據(jù)

    這篇文章主要介紹了python3 讀取Excel表格中的數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2018-10-10

最新評(píng)論

崇阳县| 山东省| 绥化市| 观塘区| 慈利县| 长阳| 察哈| 广德县| 武强县| 鄂州市| 同仁县| 正蓝旗| 云和县| 托克逊县| 仁怀市| 辽源市| 新建县| 黎川县| 潞西市| 贡山| 同心县| 高清| 正镶白旗| 扶绥县| 彭州市| 翁源县| 潼南县| 新安县| 东兴市| 光山县| 海林市| 青河县| 唐河县| 庐江县| 佛学| 天峻县| 眉山市| 陵水| 那坡县| 宁陕县| 怀远县|