日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

Python魔術(shù)方法深入分析講解_python

作者:HaiFan. ? 更新時(shí)間: 2023-04-17 編程語(yǔ)言

前言

魔術(shù)方法就是一個(gè)類/對(duì)象中的方法,和普通方法唯一的不同是:普通方法需要調(diào)用,而魔術(shù)方法是在特定時(shí)刻自動(dòng)觸發(fā)

__init__

初始化魔術(shù)方法

初始化魔術(shù)方法
如何觸發(fā):初始化對(duì)象時(shí)觸發(fā)
參數(shù):至少一個(gè)self
返回值:無(wú)
作用:初始化對(duì)象的成員
注:使用這個(gè)方式初始化的成員都是寫入對(duì)象中的,類中不存在

class Person:
    def __init__(self,name):
        self.name = name
a = Person('lisan')
print(a.name)

__new__

實(shí)例化魔術(shù)方法

如何觸發(fā):在實(shí)例化對(duì)象時(shí)觸發(fā)

參數(shù):至少一個(gè)cls,接收當(dāng)前類

返回值:必須返回一個(gè)對(duì)象實(shí)例

作用:實(shí)例化對(duì)象

注意:實(shí)例化對(duì)象是Object類底層實(shí)現(xiàn),其他類繼承了Object的 __new__才能夠?qū)崿F(xiàn)實(shí)例化對(duì)象。沒(méi)事別碰這個(gè)魔術(shù)方法,先觸發(fā)__new__,才會(huì)觸發(fā)__init__

class Person:
    def __init__(self,name):
        print('------------init')
        self.name = name
    def __new__(cls,*args,**kwargs):
        print('----------new')
        return super(Person,cls).__new__(cls,*args,**kwargs)
a = Person('lisan')

__call__

調(diào)用對(duì)象的魔術(shù)方法

如何觸發(fā):將對(duì)象當(dāng)作函數(shù)調(diào)用時(shí)觸發(fā)對(duì)象()

參數(shù):至少一個(gè)self接收對(duì)象

返回值:根據(jù)情況而定

作用:可以將復(fù)雜的步驟進(jìn)行合并操作,減少調(diào)用的步驟,方便使用

注意:無(wú)

class Person:
    def __init__(self):
        print('------------init')
    def __new__(cls ,*args ,**kwargs):
        print('----------new')
        ip = object.__new__(cls ,*args ,**kwargs)
        print(ip)
        return ip
    def __call__(self ,name):
        print('-----------call')
        print(f'執(zhí)行對(duì)象得到的參數(shù){name}')
a = Person()
a('nbnb')

__del__

析構(gòu)魔術(shù)方法

如何觸發(fā):當(dāng)對(duì)象沒(méi)有用(沒(méi)有任何變量引用)的時(shí)候觸發(fā)

參數(shù):一個(gè)self

返回值:無(wú)

作用:使用完對(duì)象是回收資源

注意:del不一定會(huì)觸發(fā)當(dāng)前方法,只有當(dāng)前對(duì)象沒(méi)有任何變量接收時(shí)才會(huì)觸發(fā)

class Person:
    def __init__(self,name):
        self.name = name
    def __del__(self):
        pass
a = Person('lisi')
b = a
print(b.name)
b.name = 'wangwu'
print(a.name)

通過(guò)del可以刪除某對(duì)象對(duì)地址的引用。

通過(guò)import sys``sys.getrefcount(a)可以查看對(duì)地址的引用次數(shù)。

當(dāng)代碼全部執(zhí)行結(jié)束的時(shí)候,會(huì)自動(dòng)執(zhí)行del方法。

__str__

觸發(fā)時(shí)機(jī):當(dāng)你打印對(duì)象名的時(shí)候自動(dòng)觸發(fā),調(diào)用 __str__里面的內(nèi)容

注意:一定要加返回值,return后面的內(nèi)容就是打印對(duì)象看到的內(nèi)容。

class Person:
    def __init__(self,name):
        self.name = name
    # def __str__(self):
    #     return self.name
a = Person('lisan')
print(a)

當(dāng)我們直接打印對(duì)象的時(shí)候,打印出來(lái)的是一個(gè)地址,這個(gè)地址我們是看不懂的,編譯器才看得懂。

想打印對(duì)象名,要顯示出準(zhǔn)確的東西,就需要 __str__

class Person:
    def __init__(self,name):
        self.name = name
    def __str__(self):
        return self.name
a = Person('lisan')
print(a)

總結(jié)

__init__和__str__這兩個(gè)是重點(diǎn)。

__new__的作用:開(kāi)辟空間

__del__的作用:沒(méi)有指針引用的時(shí)候會(huì)調(diào)用,一般是不需要重寫的

__call__的作用:想不想讓對(duì)象當(dāng)函數(shù)用。

原文鏈接:https://blog.csdn.net/weixin_73888239/article/details/128883566

欄目分類
最近更新