最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python常用的魔法方法(雙下劃線)

 更新時(shí)間:2021年09月01日 15:59:42   作者:程序媛小莊  
本文介紹一下python中常用的魔法方法以及面向?qū)ο笾蟹浅V匾膯卫J健>哂幸欢ǖ膮⒖純r(jià)值,感興趣的可以了解一下

前言

本文介紹一下python中常用的魔法方法以及面向?qū)ο笾蟹浅V匾膯卫J健?br />

魔法方法

python中一切皆對(duì)象,因?yàn)閜ython是面向?qū)ο蟮木幊陶Z(yǔ)言。python給類和對(duì)象提供了大量的內(nèi)置方法,這些內(nèi)置方法也稱魔法方法。這些魔法方法總是在某種條件下自動(dòng)觸發(fā)執(zhí)行,就像魔法一樣。

__init__方法

該方法是用來(lái)接收定義類時(shí)類中__new__方法返回的空對(duì)象后為空對(duì)象進(jìn)行初始化的操作,沒(méi)有返回值。

class Test():
    def __init__(self, name):
        self.name = name
        
    def test(self):
        print(self.name)
   
t = Test('xu')
t1 = Test('python')

__new__方法

該方法是當(dāng)類被調(diào)用實(shí)例化對(duì)象時(shí)首先被觸發(fā)的方法,用來(lái)實(shí)例化一個(gè)空對(duì)象并返回。

class Test():
    def __new__(cls,*args, **kwargs):
        return object.__new__(cls, *args, **kwargs) 
    
    def __init__(self, name):
        self.name = name

__call__方法

如果想讓一個(gè)對(duì)象變成一個(gè)可調(diào)用對(duì)象(加括號(hào)可以調(diào)用),需要在該對(duì)象的類中定義__call__方法,調(diào)用可調(diào)用對(duì)象的返回值就是__call__方法的返回值。

class Test():
    
    def __init__(self):
        self.name = 'python'
    
    def __call__(self, *args, **kwargs):  # self是Test類的對(duì)象
        print(self)  # <__main__.Test object at 0x000001C78CE78FD0>
        print(self.name)
        
t = Test()
t()  # python

__str___方法

當(dāng)對(duì)象被訪問(wèn)打印時(shí)觸發(fā)執(zhí)行,該方法必須有一個(gè)字符串類型的返回值。

class Test():
    def __init__(self, name):
        self.name = name
 
    def __str__(self):
        return self.name
   
t = Test('xu')
print(t1)  # xu

__del___方法

__del__方法是在對(duì)象被刪除時(shí)自動(dòng)觸發(fā),由于python的垃圾回收機(jī)制會(huì)自動(dòng)清理程序中沒(méi)用的資源,因此如果一個(gè)對(duì)象只是占用應(yīng)用程序的資源,沒(méi)有必要定義__del__方法,但是如果設(shè)計(jì)到占用系統(tǒng)資源的話比如打開(kāi)的文件對(duì)象,由于關(guān)系到操作系統(tǒng)的資源,python的垃圾回收機(jī)制派不上用場(chǎng)的時(shí)候,就需要為對(duì)象創(chuàng)建__del__方法,用于對(duì)象被刪除后自動(dòng)觸發(fā)回收操作系統(tǒng)資源。

class Test:
    def __init__(self):
        self.x = open('a.txt',mode='w')
        # self.x = 占用的是操作系統(tǒng)資源

    def __del__(self):
        print('run')
        # 發(fā)起系統(tǒng)調(diào)用,告訴操作系統(tǒng)回收相關(guān)的系統(tǒng)資源
        self.x.close()

obj = T()
del obj # obj.__del__() 

__enter__ & __exit__方法

使用with上下文管理時(shí),會(huì)觸發(fā)對(duì)象中的__enter__方法,并將__enter__方法的返回值賦值給as聲明的變量。
with語(yǔ)句正常結(jié)束的時(shí)候會(huì)觸發(fā)__exit__方法,該方法的三個(gè)參數(shù)分別代表異常類型、異常值和溯源信息,如果with語(yǔ)句代碼塊出現(xiàn)異常,則with語(yǔ)句后的代碼都不會(huì)被執(zhí)行,但是如果該方法返回值為T(mén)rue,異常會(huì)被清空,with代碼塊后的代碼還會(huì)被正常執(zhí)行。代碼如下:

class Open:
    def __init__(self):
        self.name = 'open'

    def __enter__(self):
        print('with語(yǔ)句執(zhí)行時(shí)會(huì)首先執(zhí)行的方法,返回值會(huì)賦值給as聲明的變量')
        return self.name

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('with中的代碼塊執(zhí)行完畢時(shí)執(zhí)行exit')
        print(exc_type, '如果出現(xiàn)異常表示異常類型')
        print(exc_val, '表示異常的值')
        print(exc_tb, '表示異常的溯源信息')
        return 123  # 非零 非空 非None為真

    
with Open() as test:
    print(test)
    raise TypeError('看一下錯(cuò)誤信息')
print('我會(huì)不會(huì)被執(zhí)行呢')  # 當(dāng)__exit__方法返回值為真時(shí),會(huì)被執(zhí)行,否則不會(huì)被執(zhí)行

item系列方法

item系列方法包括__setitem__、__getitem__、delitem__方法,這三種方法分別會(huì)在中括號(hào)賦值/修改值、中括號(hào)取值、中括號(hào)刪除值時(shí)觸發(fā),比如可以自定義一個(gè)字典類,并自定義中括號(hào)賦值、取值、刪除值的方法:

class MyDict(dict):

    def __setitem__(self, key, value):
        print('執(zhí)行setitem', key, value)  # 執(zhí)行setitem, x, 1
        self.__dict__[key] = value

    def __getitem__(self, item):
        print('執(zhí)行g(shù)etitem', item)  # 執(zhí)行g(shù)etitem x
        print(self.__dict__[item])  # 1

    def __delitem__(self, key):
        print('執(zhí)行delitem', key)  # 執(zhí)行delitem x
        self.__dict__.pop(key)


d = MyDict()
d['x'] = 1
print(d['x'])
del d['x']

attr系列方法

attr系列方法包括__setattr__,__getattr__,__delattr__,__setattr__在添加/修改屬性時(shí)會(huì)觸發(fā),___delattr__刪除屬性的時(shí)候觸發(fā),__getattr__在使用.調(diào)用屬性并且屬性不存在時(shí)觸發(fā)。如下代碼所示

class Test:
    def __init__(self):
        self.name = 'python'

    def __setattr__(self, key, value):
        print('添加/修改屬性setattr')
        self.__dict__[key] = value
        # self.key = value  # 會(huì)出現(xiàn)無(wú)線遞歸,因?yàn)閷?duì)象.屬性會(huì)調(diào)用__setattr__方法

    def __delattr__(self, item):
        print('刪除屬性delattr')
        self.__dict__.pop(item)

    def __getattr__(self, item):
        print('屬性不存在時(shí)調(diào)用getattr')
t = Test()
t.x = 'x'
print(t.y)
del t.x

單例模式

單例模式是一種軟件設(shè)計(jì)模式,為了保證一個(gè)類無(wú)論調(diào)用多少次產(chǎn)生的對(duì)象都指向同一個(gè)內(nèi)存地址,即僅僅只有一個(gè)對(duì)象。
實(shí)現(xiàn)單例模式的方式有很多,總的原則就是保證一個(gè)類只要實(shí)例化一個(gè)對(duì)象,因此關(guān)鍵點(diǎn)就是如何判斷這個(gè)類是否實(shí)例化過(guò)一個(gè)對(duì)象。

這里介紹幾種實(shí)現(xiàn)方式,供大家參考:

模塊導(dǎo)入的方式

這種方式的原理是模塊導(dǎo)入后只運(yùn)行一次,后面再次使用該模塊中的類是直接從內(nèi)存中查找。

# cls_singleton.py
class Foo(object):
    pass

instance = Foo()

# test.py
import cls_singleton

obj1 = cls_singleton.instance
obj2 = cls_singleton.instance
print(obj1 is obj2)  # True

通過(guò)__new__方法

原理就是判斷類是否有實(shí)力,有就直接返回,沒(méi)有就保存到_instance中

class Test:

    _instance = None

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __new__(cls, *args, **kwargs):
        # if cls._instance:
        #     return cls._instance                 # 有實(shí)例則直接返回
        # else:
        #     cls._instance = super().__new__(cls) # 沒(méi)有實(shí)例則new一個(gè)并保存
        #     return cls._instance                 # 這個(gè)返回是給是給init,再實(shí)例化一次,也沒(méi)有關(guān)系

        if not cls._instance:                         # 這是簡(jiǎn)化的寫(xiě)法,上面注釋的寫(xiě)法更容易提現(xiàn)判斷思路
            cls._instance = super().__new__(cls)
        return cls._instance


t1 = Test('python', 18)
t2 = Test('python1', 18)
print(t1 is t2)  # True

自定義元類的方式

這種方式的原理是類調(diào)用的過(guò)程,類定義時(shí)會(huì)調(diào)用元類下的__init__,類調(diào)用(實(shí)例化對(duì)象)時(shí)會(huì)觸發(fā)元類下的__call__方法。

class Mymeta(type):

    def __init__(cls, name, bases, dic):
        super().__init__(name, bases, dic)
        cls._instance = None                    # 將記錄類的實(shí)例對(duì)象的數(shù)據(jù)屬性放在元類中自動(dòng)定義了

    def __call__(cls, *args, **kwargs):                   # 此call會(huì)在類被調(diào)用(即實(shí)例化時(shí)觸發(fā))
        if cls._instance:      # 判斷類有沒(méi)有實(shí)例化對(duì)象
            return cls._instance
        else:        # 沒(méi)有實(shí)例化對(duì)象時(shí),控制類造空對(duì)象并初始化
            obj = cls.__new__(cls, *args, **kwargs)
            obj.__init__(*args, **kwargs)
            cls._instance = obj             # 保存對(duì)象,下一次再實(shí)例化可以直接返回而不用再造對(duì)象
            return obj


class Test(metaclass=Mymeta):
    def __init__(self, name, age):
        self.name = name
        self.age = age


t1 = Test('python', 18)
t2 = Test('python1', 18)
print(t1 is t2)  # True

結(jié)語(yǔ) 

到此這篇關(guān)于python常用的魔法方法(雙下劃線)的文章就介紹到這了,更多相關(guān)python 魔法方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python 迭代器與生成器實(shí)例詳解

    Python 迭代器與生成器實(shí)例詳解

    這篇文章主要介紹了Python 迭代器與生成器實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Python實(shí)現(xiàn)發(fā)送警告通知到企業(yè)微信方法詳解

    Python實(shí)現(xiàn)發(fā)送警告通知到企業(yè)微信方法詳解

    常見(jiàn)的報(bào)警方式有:郵件,電話,短信,微信。本文將介紹如何利用Python發(fā)送警告通知到企業(yè)微信,文中的示例代碼有一定的參考價(jià)值,感興趣的可以了解一下
    2022-01-01
  • python操作toml文件的示例代碼

    python操作toml文件的示例代碼

    這篇文章主要介紹了python操作toml文件的示例代碼,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-11-11
  • Python3-異步進(jìn)程回調(diào)函數(shù)(callback())介紹

    Python3-異步進(jìn)程回調(diào)函數(shù)(callback())介紹

    這篇文章主要介紹了Python3-異步進(jìn)程回調(diào)函數(shù)(callback())介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-05-05
  • Python基于回溯法子集樹(shù)模板解決最佳作業(yè)調(diào)度問(wèn)題示例

    Python基于回溯法子集樹(shù)模板解決最佳作業(yè)調(diào)度問(wèn)題示例

    這篇文章主要介紹了Python基于回溯法子集樹(shù)模板解決最佳作業(yè)調(diào)度問(wèn)題,簡(jiǎn)單說(shuō)明了作業(yè)調(diào)度問(wèn)題并結(jié)合實(shí)例形式給出了Python使用回溯法子集樹(shù)模板實(shí)現(xiàn)最佳作業(yè)調(diào)度問(wèn)題的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • Python編寫(xiě)一個(gè)多線程的12306搶票程序的示例

    Python編寫(xiě)一個(gè)多線程的12306搶票程序的示例

    對(duì)于很多人來(lái)說(shuō),搶購(gòu)火車票人們成了一個(gè)令人頭疼的問(wèn)題,本文主要介紹了Python編寫(xiě)一個(gè)多線程的12306搶票程序的示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • python 基于dlib庫(kù)的人臉檢測(cè)的實(shí)現(xiàn)

    python 基于dlib庫(kù)的人臉檢測(cè)的實(shí)現(xiàn)

    這篇文章主要介紹了python 基于dlib庫(kù)的人臉檢測(cè)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Tensorflow中的dropout的使用方法

    Tensorflow中的dropout的使用方法

    這篇文章主要介紹了Tensorflow中的dropout的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Matplotlib繪制雷達(dá)圖和三維圖的示例代碼

    Matplotlib繪制雷達(dá)圖和三維圖的示例代碼

    這篇文章主要介紹了Matplotlib繪制雷達(dá)圖和三維圖的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Python 字典dict使用介紹

    Python 字典dict使用介紹

    這篇文章主要介紹了Python 字典dict使用介紹,需要的朋友可以參考下
    2014-11-11

最新評(píng)論

洮南市| 沿河| 枣庄市| 浦城县| 新晃| 甘南县| 南乐县| 布拖县| 兴仁县| 象山县| 东阿县| 阿坝| 仁怀市| 姜堰市| 横峰县| 武鸣县| 铜山县| 乌兰浩特市| 开化县| 扎鲁特旗| 禄劝| 家居| 时尚| 淳安县| 乐东| 崇义县| 民县| 大厂| 新宾| 鞍山市| 定安县| 巴林右旗| 仁寿县| 太康县| 英超| 嘉义市| 滕州市| 连平县| 鄂伦春自治旗| 松阳县| 霍城县|