亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

構(gòu)造(__new__)和初始化(__init__)

通過上一篇的內(nèi)容,我們已經(jīng)知道定義一個(gè)類時(shí),我們經(jīng)常會(huì)通過 __init__(self) 的方法在實(shí)例化對(duì)象的時(shí)候,對(duì)屬性進(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)建類的對(duì)象,還有一步就是對(duì)類進(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__ 方法。

0c41739cbc728401d6b87605a65a7e9.png

def __new__(cls) 是在 def __init__(self) 方法之前調(diào)用的,作用是返回一個(gè)實(shí)例對(duì)象。還有一點(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è)對(duì)象,把參數(shù)傳給 __init__ 方法進(jìn)行實(shí)例化。

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

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


繼續(xù)學(xué)習(xí)
||
提交重置代碼