鍍金池/ 教程/ Python/ 二、構(gòu)造(<code>__new__</code>)和初始化(<code>__init__</code>)
二、Enum 的源碼
前言
一、Python 模塊簡介
一、List(列表)
五、匿名函數(shù)
三、什么是元類
二、循環(huán)語句
二、模塊的使用
三、第一個 Python 程序
線程與進(jìn)程
Python
三、條件語句和循環(huán)語句綜合實例
四、對象的描述器
三、類的屬性
一、迭代
五、迭代器和生成器綜合例子
六、運算符相關(guān)的魔術(shù)方法
一、枚舉類的使用
前言
一、簡明概述
二、Python 的基本數(shù)據(jù)類型
多線程編程
五、作用域
四、包
四、枚舉的比較
四、Python 中的變量
六、類的多態(tài)
一、Python 中類也是對象
一、Python 的 Magic Method
前言
四、生成器
一、面向?qū)ο蟮母拍?/span>
五、類的繼承
二、類
二、使用 <code>type()</code> 動態(tài)創(chuàng)建類
進(jìn)程
二、set
三、主模塊和非主模塊
一、字典(Dictionary)
前言
前言
前言
前言
四、集成開發(fā)環(huán)境(IDE): PyCharm
前言
四、函數(shù)的參數(shù)
三、lsit 生成式(列表生成式)
四、自定義元類
四、類的方法
二、函數(shù)傳值問題
二、注釋
一、條件語句
一、Python 語法的簡要說明
三、函數(shù)返回值
三、基本數(shù)據(jù)類型轉(zhuǎn)換
三、屬性的訪問控制
二、Python 的安裝
前言
三、命名規(guī)范
一、Python 自定義函數(shù)的基本步驟
三、自定義類型的枚舉
五、自定義容器(Container)
二、Python 迭代器
前言
二、tuple(元組)
一、Python 簡介
前言
前言
前言
二、構(gòu)造(<code>__new__</code>)和初始化(<code>__init__</code>)
前言

二、構(gòu)造(<code>__new__</code>)和初始化(<code>__init__</code>)

通過上一篇的內(nèi)容,我們已經(jīng)知道定義一個類時,我們經(jīng)常會通過 __init__(self) 的方法在實例化對象的時候,對屬性進(jìn)行設(shè)置。比如下面的例子:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

class User(object):
    def __init__(self, name, age):
        self.name = name;
        self.age = age;

user=User('兩點水',23)

實際上,創(chuàng)建一個類的過程是分為兩步的,一步是創(chuàng)建類的對象,還有一步就是對類進(jìn)行初始化。__new__ 是用來創(chuàng)建類并返回這個類的實例, 而__init__ 只是將傳入的參數(shù)來初始化該實例.__new__ 在創(chuàng)建一個實例的過程中必定會被調(diào)用,但 __init__ 就不一定,比如通過pickle.load 的方式反序列化一個實例時就不會調(diào)用 __init__ 方法。

Python類創(chuàng)建的過程

def __new__(cls) 是在 def __init__(self) 方法之前調(diào)用的,作用是返回一個實例對象。還有一點需要注意的是:__new__ 方法總是需要返回該類的一個實例,而 __init__ 不能返回除了 None 的任何值

具體的示例:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

class User(object):
    def __new__(cls, *args, **kwargs):
        # 打印 __new__方法中的相關(guān)信息
        print('調(diào)用了 def __new__ 方法')
        print(args)
        # 最后返回父類的方法
        return super(User, cls).__new__(cls)

    def __init__(self, name, age):
        print('調(diào)用了 def __init__ 方法')
        self.name = name
        self.age = age

if __name__ == '__main__':
    usr = User('兩點水', 23)

看看輸出的結(jié)果:

調(diào)用了 def __new__ 方法
('兩點水', 23)
調(diào)用了 def __init__ 方法

通過打印的結(jié)果來看,我們就可以知道一個類創(chuàng)建的過程是怎樣的了,先是調(diào)用了 __new__ 方法來創(chuàng)建一個對象,把參數(shù)傳給 __init__ 方法進(jìn)行實例化。

其實在實際開發(fā)中,很少會用到 __new__ 方法,除非你希望能夠控制類的創(chuàng)建。通常講到 __new__ ,都是牽扯到 metaclass(元類)的。

當(dāng)然當(dāng)一個對象的生命周期結(jié)束的時候,析構(gòu)函數(shù) __del__ 方法會被調(diào)用。但是這個方法是 Python 自己對對象進(jìn)行垃圾回收的。