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ā)
  • 作用:可以設置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ù)接受訪問對象成員名稱的字符串
  • 返回值: 有 不設定返回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ù)方法中禁止使用當前對象.成員名=值得方式,會觸發(fā)遞歸操作!
    代碼:
class Human:
    # 添加成員屬性(加入對象)
    def __init__(self):
        self.name='東方不敗'
        self.sex='男'
        self.age=18

    def __setattr__(self, key, value):
        # 這樣可以設置性別不修改
        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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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