Python魔術(shù)方法

一贮配、常用魔術(shù)方法

特點:不需要人工調(diào)用,在特定的時刻自動執(zhí)行.

1.__ init __ :初始化魔術(shù)方法(最重要)

  • 觸發(fā)時機:實例化對象之后觸發(fā)
  • 作用:為對象添加所屬成員
  • 參數(shù):一個self接受當前對象,其他的參數(shù)根據(jù)實例化的傳參決定
  • 返回值:無
  • 注意事項:無
    代碼:
class Human:
    def __init__(self,kindname,petname):
        self.sex='男'
        self.age=1
        self.name=kindname
        self.petname=petname

if __name__=='__main__':
    # 創(chuàng)建一個對象
    one=Human('劉佳琪','小妮子')
    # 輸出對象的成員
    print(one.__dict__)

輸出結(jié)果:

{'sex': '男', 'age': 1, 'name': '劉佳琪', 'petname': '小妮子'}

2.__ new __:構(gòu)造方法

  • 觸發(fā)時機:實例化對象的時候觸發(fā)
  • 作用:管理控制對象的生成
  • 參數(shù):一個cls接收當前類,其他的參數(shù)根據(jù)實例化的參數(shù)決定
  • 返回值:可有可無 沒有返回值,實例化結(jié)果為None
  • 注意事項:new 魔術(shù)方法跟init的魔術(shù)方法的參數(shù)一致(除了第一個)
    代碼:
class Human:
    def __new__(cls, sex):
        # 如果生女就返回對象,如果生男就不管
        if sex=='女':
            return object.__new__(cls)
        else:
            return None

if __name__=='__main__':
    # 創(chuàng)建一個對象
    one=Human('男')
    # 輸出對象的成員
    print(one)

輸出結(jié)果:

None

3.__ del __:析構(gòu)方法

  • 觸發(fā)時機:對象被系統(tǒng)回收的時候自動觸發(fā)(del不一定觸發(fā))
  • 作用:回收程序使用過程的信息和變量等,在操作數(shù)據(jù)庫的時候最終關(guān)閉數(shù)據(jù)庫
  • 參數(shù):一個self接收當前對象
  • 返回值:無
  • 注意事項:無
    代碼:
class Human:
    def __del__(self):
        print('del方法被觸發(fā)了')

if __name__=='__main__':
    # 創(chuàng)建一個對象
    one=Human()
    # 輸出對象的成員
    print(one)

4.__ call __:

  • 觸發(fā)時機:將對象當做函數(shù)調(diào)用的時候自動觸發(fā)
  • 作用:常用于歸結(jié)類/對象的操作步驟,方便后期調(diào)用
  • 參數(shù):一個self接收當前對象,其余的參數(shù)根據(jù)需求添加
  • 返回值:可以有可以無
  • 注意事項:無
    代碼:
class MakeCake:
    def huomian(self):
        print("和面")

    def fajiao(self):
        print('發(fā)酵')

    def honbei(self):
        print('烘焙')

    def qiexinzhuan(self):
        print('切形狀')

    def fangshuiguo(self):
        print('放水果')

    def __call__(self,name):
        self.huomian()
        self.fajiao()
        self.honbei()
        self.qiexinzhuan()
        self.fangshuiguo()
        print('給{}做的蛋糕已經(jīng)完成'.format(name))

if __name__=='__main__':
    cake=MakeCake()
    cake('張三')

輸出結(jié)果:

和面
發(fā)酵
烘焙
切形狀
放水果
給張三做的蛋糕已經(jīng)完成

5.__ len __:

  • 觸發(fā)時機:使用len函數(shù)檢測對象的時候自動觸發(fā)
  • 作用:使用len可以檢測對象中某個數(shù)據(jù)的信息
  • 參數(shù):一個self接收當前對象
  • 返回值:必須有返回值,必須是整型
  • 注意事項:len檢測什么,由開發(fā)者自定定
    代碼:
class car:
    # 成員屬性
    color='黑色'
    weight='2T'
    grand='奧利奧'
    circle=['左前輪','右前輪','左后輪','右后輪','備胎']

    # 成員方法
    def playmusic(self):
        print('你存在我深深的腦海')

    def move(self):
        print('請注意倒車,請注意倒車')

    def __len__(self):
        num=len(self.circle)
        return num

# 實例化一個對象
mycar=car()

# 定義了len方法,就可以直接使用len計算這個類的長度
result=len(mycar)
print(result)

輸出結(jié)果:

5

6.__ str __:

  • 觸發(fā)時機:使用print打印對象的時候自動觸發(fā)
  • 作用:可以定義打印對象顯示的信息內(nèi)容
  • 參數(shù):一個self接受當前對象
  • 返回值:必須有,且必須是字符串
  • 注意事項:除了print之外,使用str()轉(zhuǎn)換數(shù)據(jù)的時候也會觸發(fā)
    代碼:
class Human:
    # 成員屬性
    color = '黃色'
    sex = '女'
    age = 18
    name = '史珍香'

    # 成員方法
    def __str__(self):
        # 重載魔術(shù)方法__str__(繼承自object類)
        return self.name

    def eat(self):
        print('真香~')

    def smile(self):
        print('哈哈哈哈哈')

if __name__ == '__main__':
    wuman = Human()
    # 第一種觸發(fā)方式
     print(wuman)

輸出結(jié)果:

史珍香

7.__ repr __:

  • 觸發(fā)時機:在使用repr轉(zhuǎn)換對象的時候自動觸發(fā)
  • 作用:可以設(shè)置repr函數(shù)操作對象的結(jié)果
  • 參數(shù):一個self接受當前對象本身
  • 返回值:必須有,且必須是字符串
  • 注意事項:在正常情況下repr和str魔術(shù)方法是完全一樣的(字符串中的str和repr魔術(shù)方法就不一樣)
    代碼:
class Human:
    # 成員屬性
    color = '黃色'
    sex = '女'
    age = 18
    name = '史珍香'

    # 成員方法
    # __repr__魔術(shù)方法,在通常的類中repr重載相當于str也被重載
    def __repr__(self):
        print('repr方法被觸發(fā)')
        return self.name

    def __str__(self):
        return 'str被觸發(fā)'
    # 所有類默認都存在一個等式
    # __str__=__repr__ 將repr的方法賦值給str方法 完全一樣

    def eat(self):
        print('真香~')

    def smile(self):
        print('哈哈哈哈哈')

human=Human()
print(human)
print(repr(human))

輸出結(jié)果:

str被觸發(fā)
repr方法被觸發(fā)
史珍香

str和repr的區(qū)別:

mysong='我\n喜歡\t你'
print(mysong)
print(str(mysong))
print(repr(mysong))

輸出結(jié)果:


喜歡 你

喜歡 你
'我\n喜歡\t你'

8.__ bool __:

  • 觸發(fā)時機:在使用bool()轉(zhuǎn)換對象的時候自動觸發(fā)
  • 作用:用于檢測對象成員的信息
  • 參數(shù):一個self接受當前對象
  • 返回值:必須有,且必須是bool值
  • 注意事項:任何對象在使用bool方法的時候默認都是True
    代碼:
class man:
    sex='男'
    age=18
    married='已婚'

    def __bool__(self):
        print('bool方法已經(jīng)被觸發(fā)')
        if self.married=='已婚':
            return True
        else:
            return False

    def smkoking(self):
        print('多數(shù)男人都抽煙~')

    def say(self):
        print('男人都是甜言蜜語')
man=man()
print(bool(man))

輸出結(jié)果:

bool方法已經(jīng)被觸發(fā)
True

9.__ format __:

  • 觸發(fā)時機:在使用format()轉(zhuǎn)換對象的時候自動觸發(fā)
  • 作用:用于格式化輸出信息
  • 參數(shù):一個self接受當前對象,arg接受格式
  • 返回值:必須有,且必須為字符串格式
  • 注意事項:可以不是格式,直接作為填充輸出
    代碼:
class Girl:
    # 成員屬性
    name='熊楮墨'
    sex='女'
    age=18

    # 成員方法
    def __format__(self,arg):
        # arg是接受限定符號的字符串
        # 1.接受限定符號
        flag=arg
        print('限定符號:',flag)
        # 2.拆分限定符號
        fillchar=flag[0] # 填充字符
        align=flag[1] # 對齊方式
        length=int(flag[2:]) # 字符長度
        # 3.根據(jù)不同的符號進行不同的填充操作
        # 判斷對齊方式
        if align=='>':# 右對齊
            newname=self.name.rjust(length,fillchar)
            return newname
        elif align=='^':
            newname=self.name.center(length.fillchar)
            return newname
        elif align=='<': # 左對齊
            newname=self.name.ljust(length,fillchar)
            return newname

    def shopping(self):
        print('買買買~~')

    def eat(self):
        print('吃燒烤~~')

# 實例化一個對象
girl=Girl()
action='我想和{:@>10}去逛街'
print(action.format(girl))

輸出結(jié)果:

限定符號: @>10
我想和@@@@@@@熊楮墨去逛街

二、屬性相關(guān)的魔術(shù)方法

就是獲取成員,刪除成員,修改成員相關(guān)聯(lián)的魔術(shù)方法

5個屬性相關(guān)的魔術(shù)方法:

  • __ getattr __
  • __ setattr __
  • __ delattr __
  • __ getattribute __
  • __ dir __

屬性訪問的順序!:

  • 1.調(diào)用__ getattribute __
  • 2.【調(diào)用數(shù)據(jù)描述符】
  • 3.調(diào)用當前對象的所屬成員
  • 4.調(diào)用類的所屬成員
  • 5.【調(diào)用非數(shù)據(jù)描述符】
  • 6.調(diào)用父類的所屬成員
  • 7.調(diào)用getattr

注意:以上步驟是調(diào)用某個成員的訪問順序以及優(yōu)先級,前面的能獲取成員,就不會向后查找

1.__ getattribute __

  • 觸發(fā)時機:訪問對象成員的時候就會觸發(fā),無論成員是否存在
  • 作用:可以在用戶獲取數(shù)據(jù)的時候進行數(shù)據(jù)處理等操作
  • 參數(shù):一個self接受當前對象,另外一個參數(shù)接受訪問對象成員名稱的字符串
  • 返回值: 有 不設(shè)定返回None
  • 注意事項:在當前魔術(shù)方法中禁止使用 當前對象.成員 的方式訪問成員,會觸發(fā)遞歸操作,必須借助object的getattribute來獲取當前對象的成員變量
    代碼:

class Human:
    # 添加成員屬性(加入對象)
    def __init__(self):
        self.name='李斯'
        self.sex='男'
        self.age=18

    # 添加成員方法
    # 添加魔術(shù)方法__getattribute__
    def __getattribute__(self, item):
        # item接受的是訪問成員的名稱字符串
        # 一定不能使用當前對象的成員訪問,會再次觸發(fā)當前魔術(shù)方法進入遞歸循環(huán)
        result=object.__getattribute__(self,item)
        # 隱藏用戶名(自己的慚怍)
        newname=result[0]+'*'+result[-1]
        # 返回的數(shù)據(jù)
        return newname

    def eat(self):
        print('一天三頓小燒烤')

    def drink(self):
        print('喝啤酒')

# 實例化對象
ls=Human()
print(ls.name)

輸出結(jié)果:

李*斯

2.__ getattr __

  • 觸發(fā)時機:訪問不存在對象成員的時候自動觸發(fā)
  • 作用:防止訪問不存在的成員的時候報錯!為不存在的成員定義值
  • 參數(shù):一個self接受當前對象,另外一個參數(shù)接受訪問對象成員名稱的字符串
  • 返回值:可有可無
  • 注意事項:無
    代碼:
class Human:
    # 添加成員屬性(加入對象)
    def __init__(self):
        self.name='李斯'
        self.sex='男'
        self.age=18

    def __getattr__(self, item):
        return '訪問成員變量不存在'

    def eat(self):
        print('一天三頓小燒烤')

    def drink(self):
        print('喝啤酒')

# 實例化對象
ls=Human()
print(ls.name2)

輸出結(jié)果:

訪問成員變量不存在

3.setattr

  • 觸發(fā)時機:添加對象成員或者修改對象成員的時候自動觸發(fā)
  • 作用:可以限制或者管理對象成員的添加與修改操作
  • 參數(shù):一個self接受當前對象,第二個接受設(shè)置的成員變量名稱字符串 第三個接受設(shè)置的值
  • 返回值:無
  • 注意事項:在當前魔術(shù)方法中禁止使用當前對象.成員名=值得方式,會觸發(fā)遞歸操作!
    代碼:
class Human:
    # 添加成員屬性(加入對象)
    def __init__(self):
        self.name='東方不敗'
        self.sex='男'
        self.age=18

    def __setattr__(self, key, value):
        # 這樣可以設(shè)置性別不修改
        if key=='sex':
            object.__setattr__(self, key,'男')
        else:
            object.__setattr__(self,key,value)

    def eat(self):
        print('一天三頓小燒烤')

    def drink(self):
        print('喝啤酒')

# 實例化對象
ls=Human()
print(ls.name)
ls.name='西門吹雪'
ls.sex='女'
print(ls.name)
print(ls.sex)

輸出結(jié)果:

東方不敗
西門吹雪

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酒觅,一起剝皮案震驚了整個濱河市舷丹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖厉颤,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秤涩,死亡現(xiàn)場離奇詭異黎烈,居然都是意外死亡照棋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來霹疫,“玉大人更米,你說我怎么就攤上這事±赴剩” “怎么了臊泰?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵厂抽,是天一觀的道長。 經(jīng)常有香客問我藐守,道長卢厂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任姥闭,我火速辦了婚禮,結(jié)果婚禮上铜跑,老公的妹妹穿的比我還像新娘肋殴。我一直安慰自己,他們只是感情好驱入,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般亏较。 火紅的嫁衣襯著肌膚如雪莺褒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天雪情,我揣著相機與錄音遵岩,去河邊找鬼。 笑死旺罢,一個胖子當著我的面吹牛旷余,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扁达,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼正卧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了跪解?” 一聲冷哼從身側(cè)響起炉旷,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎叉讥,沒想到半個月后窘行,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡图仓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年罐盔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片救崔。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡惶看,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出六孵,到底是詐尸還是另有隱情纬黎,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布劫窒,位于F島的核電站本今,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏主巍。R本人自食惡果不足惜冠息,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望煤禽。 院中可真熱鬧铐达,春花似錦、人聲如沸檬果。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至杭抠,卻和暖如春脸甘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背偏灿。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工丹诀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人翁垂。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓铆遭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沿猜。 傳聞我的和親對象是個殘疾皇子枚荣,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容