python 魔法方法

建立類的時(shí)候,需要使用_init_魔法方法,感到好奇,查閱資料后,總結(jié)一下。

_new_(cls[,...])
當(dāng)對(duì)象創(chuàng)建時(shí),第一個(gè)調(diào)用的方法就是_new_,而前面說到的_init_方法更像是一個(gè)配置文件。_new_才是真正的構(gòu)造函數(shù),創(chuàng)建并返回一個(gè)實(shí)例對(duì)象,如果_new_只調(diào)用了一次,就會(huì)得到一個(gè)對(duì)象。它的第一個(gè)參數(shù)是這個(gè)類,其他的參數(shù)是用來直接傳遞給_init_ 方法。

  1. _new_ 是在一個(gè)對(duì)象實(shí)例化的時(shí)候所調(diào)用的第一個(gè)方法
  2. 它的第一個(gè)參數(shù)是這個(gè)類,其他的參數(shù)是用來直接傳遞給 _init_ 方法
  3. _new_ 決定是否要使用該 _init_ 方法,因?yàn)?_new_ 可以調(diào)用其他類的構(gòu)造方法或者直接返回別的實(shí)例對(duì)象來作為本類的實(shí)例,如果 _new_ 沒有返回實(shí)例對(duì)象,則 _init_ 不會(huì)被調(diào)用
  4. _new_ 主要是用于繼承一個(gè)不可變的類型比如一個(gè) tuple 或者 string
class TestClass:
    def __init__(self):
        print("調(diào)用__init__")
    def __new__(cls, *args, **kwargs):
        print("調(diào)用__new__")
        return object.__new__(cls)#返回當(dāng)前類的實(shí)例

t = TestClass()

上下文管理器
可能有人好奇上下文管理器是什么,和魔法方法有啥關(guān)系?平時(shí)讀取文件的時(shí)候,常常說要使用with open()來進(jìn)行文件內(nèi)容的讀取,而with后跟著的就是上下文管理器,簡單的說,任何實(shí)現(xiàn)了_enter_方法和_exit_方法的對(duì)象都可以稱之為上下文管理器。它可以在執(zhí)行with 包裹的執(zhí)行代碼(也就是自己寫的那部分)前后執(zhí)行對(duì)應(yīng)的_enter_方法或_exit_方法,可以想到的就是open()執(zhí)行的_enter_是打開文件,而_exit_則是關(guān)閉了文件。順便說一句,python還提供了一個(gè)contextmanager的裝飾器,更進(jìn)一步簡化了上下文管理器的實(shí)現(xiàn)方式。

class TestClass:
    def __init__(self,name):
        self.name = name
    def __enter__(self):
        print("%s開始工作啦!"%self.name)
    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_type is None: # 可以利用exc_type來捕獲異常
            print("%s結(jié)束工作啦!"%self.name)
        else:
            print("工作出錯(cuò)了!")
            print('Type: ', exc_type)
            print('Value:', exc_val)
            print('TreacBack:', exc_tb)

        # 返回值決定了捕獲的異常是否繼續(xù)向外拋出
        # 如果是 False 那么就會(huì)繼續(xù)向外拋出,程序會(huì)看到系統(tǒng)提示的異常信息
        # 如果是 True 不會(huì)向外拋出,程序看不到系統(tǒng)提示信息,只能看到else中的輸出
        return True

t = TestClass(name = "卡比獸")

with t :
    raise NameError

print:
卡比獸開始工作啦!
工作出錯(cuò)了!
('Type: ', <type 'exceptions.NameError'>)
('Value:', NameError())
('TreacBack:', <traceback object at 0x0000000003CF9348>)

待更新。。。
參考鏈接

1.(十二)Python:常見魔法方法
2. python魔法方法詳解

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 簡介 據(jù)說,Python 的對(duì)象天生擁有一些神奇的方法,它們總被雙下劃線所包圍,他們是面向?qū)ο蟮?Python 的...
    GaoYuan117閱讀 253評(píng)論 0 0
  • 在python中,有一些內(nèi)置好的特定的方法,這些方法在進(jìn)行特定的操作時(shí)會(huì)自動(dòng)被調(diào)用,稱之為魔法方法,下面介紹幾種常...
    LittlePy閱讀 22,181評(píng)論 5 32
  • 目錄:一、構(gòu)造和初始化二、屬性訪問控制三、描述符協(xié)議四、自定義容器(Container)五、上下文管理器六、可調(diào)用...
    Recalcitrant閱讀 637評(píng)論 0 0
  • 1、什么叫魔法方法? 魔法方法:Python解釋器自動(dòng)給出默認(rèn)的,是可以給你的類增加魔力的特殊方法。如果你的對(duì)象實(shí)...
    Bling_ll閱讀 1,166評(píng)論 0 2
  • 你一定有特別孤獨(dú)的時(shí)候吧。 孤獨(dú)是你受了委屈想找人傾訴,在手機(jī)通訊錄里翻了三遍,找不到一個(gè)可以毫不顧忌就打過去的的...
    奇葩菇?jīng)?/span>閱讀 397評(píng)論 0 4

友情鏈接更多精彩內(nèi)容