構造(__new__)和初始化(__init__)
透過上一篇的內容,我們已經知道定義一個類別時,我們常常會透過 __init__(self) 的方法在實例化物件的時候,對屬性進行設定。例如下面的例子:
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
class User(object):
def __init__(self, name, age):
self.name = name;
self.age = age;
user=User('两点水',23)實際上,建立一個類別的過程是分成兩步驟的,一步是建立類別的對象,還有一步就是對類別進行初始化。 __new__ 是用來建立類別並傳回這個類別的實例, 而__init__ 只是將傳入的參數來初始化該實例.__new__ 在建立一個實例的過程中必定會被呼叫,但__init__ 就不一定,例如透過pickle .load 的方式反序列化一個實例時就不會呼叫__init__ 方法。

def __new__(cls) 是在 def __init__(self) 方法之前呼叫的,作用是傳回一個實例物件。還有一點要注意的是:__new__ 方法總是需要傳回該類別的一個實例,而__init__ 不能傳回除了None 的任何值
具體的範例:
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
class User(object):
def __new__(cls, *args, **kwargs):
# 打印 __new__方法中的相关信息
print('调用了 def __new__ 方法')
print(args)
# 最后返回父类的方法
return super(User, cls).__new__(cls)
def __init__(self, name, age):
print('调用了 def __init__ 方法')
self.name = name
self.age = age
if __name__ == '__main__':
usr = User('两点水', 23)看看輸出的結果:
调用了 def __new__ 方法
('两点水', 23)
调用了 def __init__ 方法透過列印的結果來看,我們就可以知道一個類別建立的過程是怎麼樣的了,先是呼叫了__new__ 方法來建立一個對象,把參數傳給__init__ 方法進行實例化。
其實在實際開發中,很少會用到 __new__ 方法,除非你希望能夠控制類別的建立。通常講到 __new__ ,都是牽扯到 metaclass(元類)的。
當然當一個物件的生命週期結束的時候,析構函數 __del__ 方法會被呼叫。但是這個方法是 Python 自己對物件進行垃圾回收的。
新建檔案
預覽
Clear
- 課程推薦
- 課件下載
課件暫不提供下載,工作人員正在整理中,後期請多關注該課程~ 















