python之魔術方法
構造函數
是一種特殊的方法。主要用來在創建對象時初始化對象
析構函數
析構函數(destructor) 與構造函數相反,當對象結束其生命週期,如對象所在的函數已調用完畢時,系統自動執行析構函數。析構函數往往用來做“清理善後” 的工作
構造函數__init__()
實例化對象後自動觸發,在__new__之後執行,且無返回值
構造函數__new__()
實例化對象時觸發,在__init__之前執行,
參數:cls必填,代表要實例化的類
返回值:必須返回值,返回實例化出來的實例,實例化對象取決於__new__方法返回了什麼東西
class Foo:
def __init__(self):
print("我是init方法")
def __new__(cls, *args, **kwargs):
print('我是new方法')
r = super(Foo, cls).__new__(cls)
return r
obj = Foo()
print(obj)
-------------------
#我是new方法
#我是init方法
#<__main__.Foo object at 0x0000024666434BC8>
- 如果要得到當前類的實例,應當在當前類中的__new__()方法語句中調用當前類的父類的__new__()方法
- 如果當前類是直接繼承object,當前類的__new__()方法返回的對象應該爲:
def __new__(cls, *args, **kargs):
...
return object.__new__(cls)
析構方法 __del__()
對象被系統回收的時候自動觸達(del不一定觸發),無返回值
class Foo:
def __init__(self):
print("我是__init__")
def __new__(cls, *args, **kwargs):
print('我是new方法')
r = super(Foo, cls).__new__(cls)
return r
def __del__(self):
print("我是__del__")
--------------------------------------------------------------------------
obj = Foo() # 實例化對象後觸發__new__(),返回實例化對象,再觸發__init__()
obj2 = obj
del obj #不會觸發__del__,__del__總是會在程序的最後觸發
print("測試是否是最後執行")
-----------------------
#我是new方法
#我是__init__
#測試是否是最後執行
#我是__del__
__call__()
當對象像函數一樣可以被調用,就相當於是調用它的__call__()方法
class C(A, B):
def __init__(self):
print("enter C")
super(C, self).__init__()
print("leave C")
def __call__(self, *args, **kwargs):
print("我是call方法")
c = C()
c() 當對象實例被調用==調用對象call方法
-----------
#enter C
#leave C
#我是call方法
__str__()
返回對象的描述信息
class C(A, B):
def __init__(self, name):
self.name = name
print("enter C")
super(C, self).__init__()
print("leave C")
def __str__(self):
return "我叫{}".format(self.name)