在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ 二、構(gòu)造(<code>__new__</code>)和初始化(<code>__init__</code>)
二、Enum 的源碼
前言
一、Python 模塊簡介
一、List(列表)
五、匿名函數(shù)
三、什么是元類
二、循環(huán)語句
二、模塊的使用
三、第一個(gè) Python 程序
線程與進(jìn)程
Python
三、條件語句和循環(huán)語句綜合實(shí)例
四、對象的描述器
三、類的屬性
一、迭代
五、迭代器和生成器綜合例子
六、運(yùn)算符相關(guān)的魔術(shù)方法
一、枚舉類的使用
前言
一、簡明概述
二、Python 的基本數(shù)據(jù)類型
多線程編程
五、作用域
四、包
四、枚舉的比較
四、Python 中的變量
六、類的多態(tài)
一、Python 中類也是對象
一、Python 的 Magic Method
前言
四、生成器
一、面向?qū)ο蟮母拍?/span>
五、類的繼承
二、類
二、使用 <code>type()</code> 動(dòng)態(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)知道定義一個(gè)類時(shí),我們經(jīng)常會(huì)通過 __init__(self) 的方法在實(shí)例化對象的時(shí)候,對屬性進(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('兩點(diǎn)水',23)

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

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

def __new__(cls) 是在 def __init__(self) 方法之前調(diào)用的,作用是返回一個(gè)實(shí)例對象。還有一點(diǎn)需要注意的是:__new__ 方法總是需要返回該類的一個(gè)實(shí)例,而 __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('兩點(diǎn)水', 23)

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

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

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

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

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