1. 程式人生 > 其它 >python中魔法方法

python中魔法方法

python中魔法方法

1、__del__方法

銷燬魔術方法
觸發時機:當一個物件在記憶體中被清理的時候自動執行
引數:至少有一個self,接收物件
返回值:無
作用:在物件清理的時候做一些操作
注意:程式自動呼叫此方法,不需要我們手動呼叫。

class Person(object):

    def __init__(self):
        print('init')

    def __del__(self):
        print('銷燬了')


person = Person()
person1 = person
print('程式結束了')

輸出為:

init
程式結束了
銷燬了

如上程式碼所示,當程式執行結束時,沒有再引用的變數時,__del__會生效,所以它不是像我們預想的那樣,呼叫這個物件時__del__就生效,所以 不會輸出

2、__call__方法

call():當給物件加括號時候,自定觸發的函式
進一步模糊了函式和物件之間的概念。
使用方式:物件後面加括號,觸發執行。即:物件() 或者 類()()

class Foo:

    def __init__(self):
        pass
    # 當給物件加括號時候,自定觸發的函式
    def __call__(self, *args, **kwargs):
        print('__call__')


obj = Foo()  # 執行 __init__,將Foo記憶體地址賦值給了obj
obj()  # 記憶體地址加括號就是呼叫

輸出為:

__call__

如上程式碼所示,呼叫__call__時,並不需要Foo.call。因為在obj=Foo()時,就已經將Foo()的記憶體地址賦值給了obj,所以後面呼叫時obj本身就代表了那個記憶體地址,當成函式使用obj()

3、__str__方法

觸發時機:列印物件會自定觸發的函式,方法
引數:一個self接收物件
返回值:必須是字串型別
作用:print(物件時)進行操作,得到字串,通常用於快捷操作

class People:
    school = 'SH'

    # 1. 列印物件會自定觸發的函式,方法
    # 2. 返回值必須是字串型別
    def __str__(self):
        return self.school


stu = People()
print(stu)

輸出為:

SH

python中 使用print()函式輸出物件名稱的時候預設情況下,會列印物件名引用的記憶體地址,如果希望列印物件的屬性值,可以使用__str__(self)這個方法。

4、__new__方法

例項化魔術方法
觸發時機: 在例項化對時觸發
引數:至少一個cls接收當前類
返回值:必須返回一個物件例項
作用:例項化物件
注意:例項化物件是Object類底層實現,其他類繼承了Object的__new__才能夠實現例項化物件。
沒事別碰這個魔術方法,先觸發__new__才會觸發__init__

class Person(object):

    # 初始化
    def __init__(self):
        print('init...')

    # 例項化方法(構造方法)---》建立物件
    def __new__(cls, *args, **kwargs):
        print('new...')
        ret = super().__new__(cls) # 呼叫父類的__new__()方法建立物件,並用接收返回值
        return ret # 將物件返回給person

輸出為:

new...
init...
<__main__.Person object at 0x0000012173217B80>

如上程式碼所示,要先建立一個物件,才能初始化,所以輸出是先輸出new…,才輸出init…

5、getattrsetattr、__delattr__函式

getattr:物件.屬性,當屬性不存在,會自動觸發__getattr__方法

setattr:給不存在屬性賦值的時候執行,會自動觸發__setattr__方法

delattr:當刪除屬性的時候還行,**會自動觸發__delattr__方法

    class Foo:
        x = 1

        def __init__(self, y):
            self.y = y

        # 當訪問一個不存在的屬性時候,會自定觸發
        def __getattr__(self, item):
            print('----> from getattr:你找的屬性不存在')

        def __setattr__(self, key, value):
            print('----> from setattr')
            # print(key)
            # print(value)
            # self.key = value  # 這就無限遞迴了,你好好想想
            self.__dict__[key] = value  # 應該使用它

        def __delattr__(self, item):
            print('----> from delattr')
            # del self.item #無限遞迴了
            self.__dict__.pop(item)

    obj = Foo(10)
    obj.z = 10
    print(obj.a)  # 不存在的屬性

輸出為:

----> from setattr
----> from setattr
----> from getattr:你找的屬性不存在
None