python之魔術方法

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)

 

 

原文:https://www.yuque.com/zaygee/xrp5b2/qg7c6s

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章