婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > python常用的魔法方法(雙下劃線)

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

熱門標簽:B52系統電梯外呼顯示E7 企業微信地圖標注 鶴壁手機自動外呼系統違法嗎 萊蕪電信外呼系統 沈陽防封電銷電話卡 高德地圖標注收入咋樣 地圖標注多個 怎么辦理400客服電話 銀川電話機器人電話

前言

本文介紹一下python中常用的魔法方法以及面向對象中非常重要的單例模式。

魔法方法

python中一切皆對象,因為python是面向對象的編程語言。python給類和對象提供了大量的內置方法,這些內置方法也稱魔法方法。這些魔法方法總是在某種條件下自動觸發執行,就像魔法一樣。

__init__方法

該方法是用來接收定義類時類中__new__方法返回的空對象后為空對象進行初始化的操作,沒有返回值。

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

__new__方法

該方法是當類被調用實例化對象時首先被觸發的方法,用來實例化一個空對象并返回。

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

__call__方法

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

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

__str___方法

當對象被訪問打印時觸發執行,該方法必須有一個字符串類型的返回值。

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

__del___方法

__del__方法是在對象被刪除時自動觸發,由于python的垃圾回收機制會自動清理程序中沒用的資源,因此如果一個對象只是占用應用程序的資源,沒有必要定義__del__方法,但是如果設計到占用系統資源的話比如打開的文件對象,由于關系到操作系統的資源,python的垃圾回收機制派不上用場的時候,就需要為對象創建__del__方法,用于對象被刪除后自動觸發回收操作系統資源。

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

    def __del__(self):
        print('run')
        # 發起系統調用,告訴操作系統回收相關的系統資源
        self.x.close()

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

__enter__ __exit__方法

使用with上下文管理時,會觸發對象中的__enter__方法,并將__enter__方法的返回值賦值給as聲明的變量。
with語句正常結束的時候會觸發__exit__方法,該方法的三個參數分別代表異常類型、異常值和溯源信息,如果with語句代碼塊出現異常,則with語句后的代碼都不會被執行,但是如果該方法返回值為True,異常會被清空,with代碼塊后的代碼還會被正常執行。代碼如下:

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

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

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

    
with Open() as test:
    print(test)
    raise TypeError('看一下錯誤信息')
print('我會不會被執行呢')  # 當__exit__方法返回值為真時,會被執行,否則不會被執行

item系列方法

item系列方法包括__setitem__、__getitem__、delitem__方法,這三種方法分別會在中括號賦值/修改值、中括號取值、中括號刪除值時觸發,比如可以自定義一個字典類,并自定義中括號賦值、取值、刪除值的方法:

class MyDict(dict):

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

    def __getitem__(self, item):
        print('執行getitem', item)  # 執行getitem x
        print(self.__dict__[item])  # 1

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


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

attr系列方法

attr系列方法包括__setattr__,__getattr__,__delattr__,__setattr__在添加/修改屬性時會觸發,___delattr__刪除屬性的時候觸發,__getattr__在使用.調用屬性并且屬性不存在時觸發。如下代碼所示

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

    def __setattr__(self, key, value):
        print('添加/修改屬性setattr')
        self.__dict__[key] = value
        # self.key = value  # 會出現無線遞歸,因為對象.屬性會調用__setattr__方法

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

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

單例模式

單例模式是一種軟件設計模式,為了保證一個類無論調用多少次產生的對象都指向同一個內存地址,即僅僅只有一個對象。
實現單例模式的方式有很多,總的原則就是保證一個類只要實例化一個對象,因此關鍵點就是如何判斷這個類是否實例化過一個對象。

這里介紹幾種實現方式,供大家參考:

模塊導入的方式

這種方式的原理是模塊導入后只運行一次,后面再次使用該模塊中的類是直接從內存中查找。

# 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

通過__new__方法

原理就是判斷類是否有實力,有就直接返回,沒有就保存到_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                 # 有實例則直接返回
        # else:
        #     cls._instance = super().__new__(cls) # 沒有實例則new一個并保存
        #     return cls._instance                 # 這個返回是給是給init,再實例化一次,也沒有關系

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


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

自定義元類的方式

這種方式的原理是類調用的過程,類定義時會調用元類下的__init__,類調用(實例化對象)時會觸發元類下的__call__方法。

class Mymeta(type):

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

    def __call__(cls, *args, **kwargs):                   # 此call會在類被調用(即實例化時觸發)
        if cls._instance:      # 判斷類有沒有實例化對象
            return cls._instance
        else:        # 沒有實例化對象時,控制類造空對象并初始化
            obj = cls.__new__(cls, *args, **kwargs)
            obj.__init__(*args, **kwargs)
            cls._instance = obj             # 保存對象,下一次再實例化可以直接返回而不用再造對象
            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

結語 

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

您可能感興趣的文章:
  • 淺談Python魔法方法
  • 詳解Python常用的魔法方法
  • 總結Python常用的魔法方法
  • Python魔法方法 容器部方法詳解
  • Python魔法方法功能與用法簡介
  • Python魔法方法詳解
  • python魔法方法-屬性訪問控制詳解
  • python魔法方法-屬性轉換和類的表示詳解
  • python魔法方法-自定義序列詳解

標簽:銀川 呼倫貝爾 葫蘆島 湘西 烏魯木齊 安慶 呼倫貝爾 三亞

巨人網絡通訊聲明:本文標題《python常用的魔法方法(雙下劃線)》,本文關鍵詞  python,常用的,常,用的,魔法,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《python常用的魔法方法(雙下劃線)》相關的同類信息!
  • 本頁收集關于python常用的魔法方法(雙下劃線)的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    av爱爱亚洲一区| 亚洲人123区| 91美女在线观看| 国产不卡在线一区| 99久久精品国产一区二区三区| 国内成人免费视频| 国产91精品在线观看| 国产精品99久久久| 成人黄色小视频在线观看| 成人av电影在线观看| 不卡一区在线观看| 97久久超碰国产精品电影| 在线看国产一区二区| 欧美婷婷六月丁香综合色| 制服.丝袜.亚洲.另类.中文| 精品国产一区久久| 国产精品女主播在线观看| 一区二区三区四区激情| 久久国产剧场电影| 色狠狠av一区二区三区| 久久综合精品国产一区二区三区| 国产精品全国免费观看高清| 亚洲欧美一区二区三区极速播放| 天堂av在线一区| 97精品久久久午夜一区二区三区 | 一区二区三区美女视频| 国产一区二区毛片| 日本精品免费观看高清观看| 久久久91精品国产一区二区精品| 亚洲国产视频a| 99精品久久只有精品| 免费观看在线综合| 在线欧美日韩精品| 国产性色一区二区| 午夜精品一区在线观看| 国产成人免费视频| 成人免费视频视频在线观看免费| 欧美一区二区三区在线看| 国产精品久久久久久久久免费桃花 | 樱花影视一区二区| 久久91精品国产91久久小草| 8v天堂国产在线一区二区| 五月婷婷另类国产| 91.麻豆视频| 国产露脸91国语对白| 国产三级精品三级| 国产精品综合在线视频| 一区在线播放视频| 欧美日韩视频专区在线播放| 日韩成人一区二区| 中文子幕无线码一区tr| 99国产精品久久久久| 三级欧美在线一区| 中文字幕佐山爱一区二区免费| 日韩欧美中文一区二区| 国产一区二区精品久久| 欧美人xxxx| 国产又粗又猛又爽又黄91精品| 国产精品入口麻豆原神| 91精品欧美一区二区三区综合在| 精品一区二区三区在线观看国产| 综合中文字幕亚洲| 精品日韩一区二区三区免费视频| 色婷婷亚洲婷婷| 成人天堂资源www在线| 日韩成人av影视| 樱花影视一区二区| 亚洲欧美乱综合| 亚洲欧美日韩国产另类专区 | 一本一道久久a久久精品综合蜜臀| 日韩综合小视频| 亚洲大片一区二区三区| 亚洲欧洲日韩一区二区三区| 69久久夜色精品国产69蝌蚪网| caoporm超碰国产精品| 国产精品一区二区不卡| 久久超碰97人人做人人爱| 午夜av区久久| 成人网男人的天堂| 精品国产欧美一区二区| 蜜臀av性久久久久蜜臀av麻豆| 国产日韩精品一区二区三区在线| 欧美剧情电影在线观看完整版免费励志电影| 久久精品国产999大香线蕉| 国产成人精品亚洲777人妖| 麻豆精品久久久| 99免费精品视频| 国产精品久久久久婷婷二区次| 国内精品久久久久影院一蜜桃| 欧美午夜影院一区| 亚洲va国产天堂va久久en| 欧美日韩高清在线| 日韩黄色免费网站| 精品久久久久久久久久久久包黑料| 丝袜美腿成人在线| 欧美日本乱大交xxxxx| 午夜精品成人在线视频| 色欧美日韩亚洲| 天堂va蜜桃一区二区三区漫画版| 69成人精品免费视频| 国产美女精品在线| 国产精品久久毛片av大全日韩| 美女脱光内衣内裤视频久久影院| 日韩精品一区二区三区中文精品| 国内成人精品2018免费看| 国产精品美女久久久久久久久久久 | 欧美一区二区高清| 视频在线观看91| 亚洲国产经典视频| 日韩一区二区三区免费看| 福利视频网站一区二区三区| 亚洲一区二区三区四区中文字幕| 中文欧美字幕免费| 国产人久久人人人人爽| 久久综合久久99| 精品国产乱码久久久久久夜甘婷婷| 91视视频在线直接观看在线看网页在线看 | 日本精品一区二区三区四区的功能| 久久精品国产亚洲高清剧情介绍| 一区二区三区不卡在线观看| 国产精品网站在线观看| 国产亚洲一区二区三区| 久久久久97国产精华液好用吗 | 丝袜a∨在线一区二区三区不卡| 成人免费在线播放视频| 夜夜嗨av一区二区三区网页| 亚洲欧美在线视频| 婷婷成人激情在线网| 亚洲精品第1页| 亚洲成人在线免费| 蜜桃一区二区三区在线观看| 麻豆成人综合网| 国产成人免费高清| 不卡欧美aaaaa| 欧美性感一类影片在线播放| 欧美日本高清视频在线观看| 国产亚洲欧美日韩俺去了| 久久午夜免费电影| 国产精品国产三级国产专播品爱网| 欧美激情一区二区三区四区| 中文字幕精品在线不卡| 日韩午夜av电影| 国产欧美日韩久久| 椎名由奈av一区二区三区| 亚洲一区二区三区国产| 日一区二区三区| 国产成人精品免费| 欧美在线免费播放| 国产日韩影视精品| 亚洲欧洲成人自拍| 久久99精品久久久久久久久久久久 | 亚洲午夜精品在线| 在线国产电影不卡| 欧美性欧美巨大黑白大战| www国产成人| 亚洲国产一区视频| 成人黄色免费短视频| 精品剧情在线观看| 亚洲成人激情自拍| 欧洲av一区二区嗯嗯嗯啊| 国产精品久久久久久久浪潮网站| 丝瓜av网站精品一区二区| 99久久久久久| 欧美大片一区二区三区| 曰韩精品一区二区| 91久久一区二区| 亚洲欧美区自拍先锋| 91国偷自产一区二区三区观看| 国产精品免费av| 欧美性高清videossexo| 亚洲成人自拍偷拍| 国产午夜亚洲精品午夜鲁丝片| 久久综合九色综合欧美98| 丰满白嫩尤物一区二区| 精品国产区一区| 成人性生交大片免费看视频在线 | 2023国产精品视频| 白白色 亚洲乱淫| 亚洲同性同志一二三专区| 欧美久久高跟鞋激| 国内精品自线一区二区三区视频| 国产亚洲成aⅴ人片在线观看| 国产99久久久国产精品免费看 | 国产精品自拍毛片| 国产亚洲欧美日韩俺去了| 99在线精品视频| 一区二区三区电影在线播| 欧美日韩精品一区二区三区| 国产一区二区视频在线播放| 美国十次了思思久久精品导航| 欧美一区二区在线不卡| 老司机免费视频一区二区三区| 国产精品视频免费看| 欧美浪妇xxxx高跟鞋交| 成人黄动漫网站免费app| 亚洲成人1区2区| 一区二区三区日本| 精品国产凹凸成av人网站| 不卡视频在线看| 国产精品一卡二|