一贮配、常用魔術(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é)果:
東方不敗
西門吹雪
男