<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python 常用魔術(shù)方法指南

          共 4655字,需瀏覽 10分鐘

           ·

          2020-11-19 14:12

          什么是魔術(shù)方法?

          在 Python 中,所有以雙下劃線__包起來的方法,統(tǒng)稱為?Magic Method(魔術(shù)方法)

          它是一種的特殊方法,普通方法需要調(diào)用,而魔術(shù)方法不需要調(diào)用就可以自動(dòng)執(zhí)行

          魔術(shù)方法在類或?qū)ο蟮哪承┦录霭l(fā)后會(huì)自動(dòng)執(zhí)行,讓類具有神奇的“魔力”,如果希望根據(jù)自己的程序定制自己特殊功能的類,那么就需要對這些方法進(jìn)行重寫?

          Python 中常用的運(yùn)算符、for 循環(huán)、以及類操作等都是運(yùn)行在魔術(shù)方法之上的

          魔術(shù)方法__init____new____del__的應(yīng)用

          class?People(object):
          ????#?創(chuàng)建對象
          ????def?__new__(cls,?*args,?**kwargs):
          ????????print("觸發(fā)了構(gòu)造方法")
          ????????ret?=?super().__new__(cls)?#?調(diào)用父類的__new__()方法創(chuàng)建對象
          ????????return?ret?##?將對象返回
          ????#?實(shí)例化對象
          ????def?__init__(self,?name,?age):
          ????????self.name?=?name
          ????????self.age?=?age
          ????????print("初始化方法")
          ????#??刪除對象
          ????#???del?對象名或者程序執(zhí)行結(jié)束之后
          ????def?__del__(self):
          ????????print("析構(gòu)方法,刪除對象")


          if?__name__?==?'__main__':
          ????p1?=?People('xiaoming',?16)
          ????
          輸出:
          觸發(fā)了構(gòu)造方法
          初始化方法
          析構(gòu)方法,刪除對象

          使用__call__方法實(shí)現(xiàn)斐波那契數(shù)列

          #?斐波那契數(shù)列指的是這樣一個(gè)數(shù)列?0,?1,?1,?2,?3,?5,?8,?13
          #?特別指出:第0項(xiàng)是0,第1項(xiàng)是第一個(gè)1。從第三項(xiàng)開始,每一項(xiàng)都等于前兩項(xiàng)之和。
          class?Fib(object):
          ????def?__init__(self):
          ????????pass
          ????def?__call__(self,num):
          ????????a,b?=?0,1;
          ????????self.l=[]

          ????????for?i?in?range?(num):
          ????????????self.l.append(a)
          ????????????a,b=?b,a+b
          ????????return?self.l
          ????def?__str__(self):
          ????????return?str(self.l)
          ????__rept__=__str__

          f?=?Fib()
          print(f(10))
          輸出:
          [0,?1,?1,?2,?3,?5,?8,?13,?21,?34]

          常用的魔術(shù)方法

          1.初始化方法__init__

          觸發(fā)機(jī)制:實(shí)例化對象之后立即觸發(fā)
          參數(shù):至少有一個(gè)self,接收當(dāng)前對象,其他參數(shù)根據(jù)需要進(jìn)行定義
          返回值:無
          作用:初始化對象的成員

          2.構(gòu)造方法__new__

          觸發(fā)時(shí)機(jī):?實(shí)例化對象時(shí)自動(dòng)觸發(fā)(在__init__之前觸發(fā))
          參數(shù):至少一個(gè)cls 接收當(dāng)前類,其他參數(shù)根據(jù)初始化方法參數(shù)決定
          返回值:必須返回一個(gè)對象實(shí)例,沒有返回值,則實(shí)例化對象的結(jié)果為None
          作用:實(shí)例化對象
          注意:實(shí)例化對象是Object類底層實(shí)現(xiàn),其他類繼承了Object的__new__才能夠?qū)崿F(xiàn)實(shí)例化對象。

          3.析構(gòu)方法__del__

          觸發(fā)時(shí)機(jī):當(dāng)該類對象被銷毀時(shí),自動(dòng)觸發(fā)
          參數(shù):一個(gè)self,接受當(dāng)前對象
          返回值:無
          作用:關(guān)閉或釋放對象創(chuàng)建時(shí)資源
          注意:del不一定會(huì)觸發(fā)當(dāng)前方法,只有當(dāng)前對象沒有任何變量引用時(shí)才會(huì)觸發(fā)

          4.__call__

          調(diào)用對象的魔術(shù)方法
          觸發(fā)時(shí)機(jī):將對象當(dāng)作函數(shù)調(diào)用時(shí)觸發(fā),方式:?對象()
          參數(shù):至少一個(gè)self接收對象,其余根據(jù)調(diào)用時(shí)參數(shù)決定
          返回值:根據(jù)情況而定
          作用:可以將復(fù)雜的步驟進(jìn)行合并操作,減少調(diào)用的步驟,方便使用
          注意:無

          5.__len__

          觸發(fā)時(shí)機(jī):使用len(對象)?的時(shí)候觸發(fā)
          參數(shù):一個(gè)參數(shù)self
          返回值:必須是一個(gè)整型
          作用:可以設(shè)置為檢測對象成員個(gè)數(shù),但是也可以進(jìn)行其他任意操作
          注意:返回值必須必須是整數(shù),否則語法報(bào)錯(cuò),另外該要求是格式要求。

          6.__str__

          觸發(fā)時(shí)機(jī):使用print(對象)或者str(對象)的時(shí)候觸發(fā)
          參數(shù):一個(gè)self接收對象
          返回值:必須是字符串類型
          作用:print(對象時(shí))進(jìn)行操作,得到字符串,通常用于快捷操作
          注意:無

          7.__repr__

          觸發(fā)時(shí)機(jī):在使用repr(對象)的時(shí)候觸發(fā)
          參數(shù):一個(gè)self接收對象
          返回值:必須是字符串
          作用:將對象轉(zhuǎn)使用repr化為字符串時(shí)使用,也可以用于快捷操作

          8.__bool__

          觸發(fā)時(shí)機(jī):?使用bool(對象)的時(shí)候觸發(fā)
          參數(shù):一個(gè)self接收對象
          返回值:必須是布爾值
          作用:根據(jù)實(shí)際情況決定,可以作為快捷方式使用
          注意:僅適合于返回布爾值的操作

          9.__format__

          觸發(fā)時(shí)機(jī):使用字符串.format(對象)時(shí)候觸發(fā)
          參數(shù):一個(gè)self接收對象,一個(gè)參數(shù)接收format的{}中的格式,例如:>5
          返回值:必須是字符串
          作用:設(shè)置對象可以作為format的參數(shù),并且自定義對象格式化的規(guī)則
          注意:無

          比較運(yùn)算相關(guān)魔術(shù)方法


          __ lt__(self, other):
          定義小于號的行為:x < y 調(diào)用 x.lt(y)
          __ le__(self, other):
          定義小于等于號的行為:x <= y 調(diào)用 x.le(y)
          __ eq__(self, other)?:
          定義等于號的行為:x == y 調(diào)用 x.eq(y)
          __ ne__(self, other):
          定義不等號的行為:x != y 調(diào)用 x.ne(y)
          __ gt__(self, other):
          定義大于號的行為:x > y 調(diào)用 x.**gt(y)
          __ ge__(self, other)?:
          定義大于等于號的行為:x >= y 調(diào)用 x.ge(y)

          算術(shù)運(yùn)算相關(guān)魔術(shù)方法


          __add__(self, other)???????????定義加法的行為:+
          __sub__(self, other)???????????定義減法的行為:-
          __mul__(self, other)???????????定義乘法的行為:*
          __truediv__(self, other)???????定義真除法的行為:/
          __floordiv__(self, other)??????定義整數(shù)除法的行為://
          __mod__(self, other)???????????定義取模算法的行為:%
          __divmod__(self,?other)????????定義當(dāng)被?divmod()?調(diào)用時(shí)的行為
          __pow__(self,?other[,?modulo])?定義當(dāng)被?power()?調(diào)用或?**?運(yùn)算時(shí)的行為
          __lshift__(self, other)????????定義按位左移位的行為:<<
          __rshift__(self, other)????????定義按位右移位的行為:>>
          __and__(self, other)???????????定義按位與操作的行為:&
          __xor__(self, other)???????????定義按位異或操作的行為:^
          __or__(self, other)????????????定義按位或操作的行為:|

          賦值運(yùn)算相關(guān)魔術(shù)方法


          __iadd__(self, other)?????????????定義賦值加法的行為:+=
          __isub__(self, other)?????????????定義賦值減法的行為:-=
          __imul__(self, other)?????????????定義賦值乘法的行為:=
          __itruediv__(self, other)?????????定義賦值真除法的行為:/=
          __ifloordiv__(self, other)????????定義賦值整數(shù)除法的行為://=
          __imod__(self, other)?????????????定義賦值取模算法的行為:%=
          __ipow__(self, other[, modulo])???定義賦值冪運(yùn)算的行為:**=
          __ilshift__(self, other)??????????定義賦值按位左移位的行為:<<=
          __irshift__(self, other)??????????定義賦值按位右移位的行為:>>=
          __iand__(self, other)?????????????定義賦值按位與操作的行為:&=
          __ixor__(self, other)?????????????定義賦值按位異或操作的行為:^=
          __ior__(self, other)??????????????定義賦值按位或操作的行為:|=

          一元運(yùn)算相關(guān)魔術(shù)方法


          __pos__(self)??????定義正號的行為:+x
          __neg__(self)??????定義負(fù)號的行為:-x
          __abs__(self)??????定義當(dāng)被?abs()?調(diào)用時(shí)的行為
          __invert__(self)???定義按位求反的行為:~x

          類型轉(zhuǎn)換相關(guān)魔術(shù)方法


          __complex__(self)??????定義當(dāng)被?complex()?調(diào)用時(shí)的行為(需要返回恰當(dāng)?shù)闹担?br>__int__(self)??????????定義當(dāng)被?int()?調(diào)用時(shí)的行為(需要返回恰當(dāng)?shù)闹担?br>__float__(self)????????定義當(dāng)被?float()?調(diào)用時(shí)的行為(需要返回恰當(dāng)?shù)闹担?br>__round__(self[,?n])???定義當(dāng)被?round()?調(diào)用時(shí)的行為(需要返回恰當(dāng)?shù)闹担?br>__index(self)__????????1.?當(dāng)對象是被應(yīng)用在切片表達(dá)式中時(shí),實(shí)現(xiàn)整形強(qiáng)制轉(zhuǎn)換
          ???????????????????????2.?如果你定義了一個(gè)可能在切片時(shí)用到的定制的數(shù)值型,你應(yīng)該定義?index
          ???????????????????????3.?如果?index?被定義,則?int?也需要被定義,且返回相同的值

          上下文管理相關(guān)魔術(shù)方法(with)

          __enter____exit__

          __enter__(self)
          ????1.?定義當(dāng)使用?with?語句時(shí)的初始化行為
          ????2.?enter?的返回值被?with?語句的目標(biāo)或者?as?后的名字綁定

          __exit__(self,?exctype,?excvalue,?traceback)
          ????1.?定義當(dāng)一個(gè)代碼塊被執(zhí)行或者終止后上下文管理器應(yīng)該做什么
          ????2.?一般被用來處理異常,清除工作或者做一些代碼塊執(zhí)行完畢之后的日常工作

          容器類型相關(guān)魔術(shù)方法

          __len__(self)??????????????????定義當(dāng)被?len()?調(diào)用時(shí)的行為(返回容器中元素的個(gè)數(shù))
          __getitem__(self,?key)?????????定義獲取容器中指定元素的行為,相當(dāng)于?self[key]
          __setitem__(self,?key,?value)??定義設(shè)置容器中指定元素的行為,相當(dāng)于?self[key]?=?value
          __delitem__(self,?key)?????????定義刪除容器中指定元素的行為,相當(dāng)于?del?self[key]
          __iter__(self)?????????????????定義當(dāng)?shù)萜髦械脑氐男袨?br>__reversed__(self)?????????????定義當(dāng)被?reversed()?調(diào)用時(shí)的行為
          __contains__(self,?item)???????定義當(dāng)使用成員測試運(yùn)算符(in?或?not?in)時(shí)的行為
          瀏覽 30
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  麻豆成人传媒网,一区二区三区四区 | 国产精品成人免费视频 | 3级片在线播放 | 国产美女被 | 五十路AV熟女片 |