這篇文章主要講解了“python的call、len、str、repr怎么使用”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“python的call、len、str、repr怎么使用”吧!
創(chuàng)新互聯(lián)2013年至今,先為營(yíng)山等服務(wù)建站,營(yíng)山等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為營(yíng)山企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
說(shuō)明:
讓一個(gè)類的實(shí)例變成可執(zhí)行的。
案例:
class Cat:'''貓類'''def __init__(self, name):self.name = name self.count = 0def eat(self):print(f'{self.name}正在進(jìn)食!')def __call__(self, *args, **kwds) -> int:for i in args:self.count += 1print(f'{self.name}抓到了{(lán)i},已抓到了{(lán)self.count}只獵物')return self.count white_cat = Cat('大白貓')white_cat('麻雀', '老鼠')out:大白貓抓到了麻雀,已抓到了1只獵物 大白貓抓到了老鼠,已抓到了2只獵物
white_cat(‘麻雀’, ‘老鼠’)效果完全等價(jià)于white_cat.__call__(‘麻雀’, ‘老鼠’)。實(shí)際上就是解釋器做了個(gè)約定:實(shí)例后面()時(shí)實(shí)際就是調(diào)用該實(shí)例的__call__方法。
假如你定義的類的綁定方法只有一個(gè)(或某個(gè)方法使用頻率非常高),那么可以把那個(gè)方法名寫(xiě)成__call__,這樣后續(xù)使用時(shí)會(huì)方便很多,可以直接用實(shí)例名()來(lái)執(zhí)行。
說(shuō)明:
對(duì)實(shí)例執(zhí)行l(wèi)en()時(shí)實(shí)際就是調(diào)用它的__len__方法。
案例:
class Cat:'''貓類'''def __init__(self, name):self.name = name self.preys = []def __len__(self):return len(self.preys)def eat(self):print(f'{self.name}正在進(jìn)食!')def __call__(self, *args, **kwargs):self.preys.extend(args)for i in args:print(f'{self.name}抓到了{(lán)i}')print(f'{self.name}抓到了{(lán)len(self)}只獵物!')white_cat = Cat('大白貓')white_cat('小麻雀', '小老鼠')white_cat('大麻雀', '大老鼠')white_cat('小貓魚(yú)', '大青魚(yú)')out:大白貓抓到了小麻雀 大白貓抓到了小老鼠 大白貓抓到了2只獵物! 大白貓抓到了大麻雀 大白貓抓到了大老鼠 大白貓抓到了4只獵物! 大白貓抓到了小貓魚(yú) 大白貓抓到了大青魚(yú) 大白貓抓到了6只獵物!
在這個(gè)案例中對(duì)之前的代碼做了優(yōu)化,現(xiàn)在的大白貓還能記住它抓到的所有獵物,當(dāng)你len(white_cat)就可以知道大白貓抓到了幾只獵物。
對(duì)一個(gè)實(shí)例使用len()時(shí),實(shí)際上就是在調(diào)用這個(gè)實(shí)例的__len__方法。
說(shuō)明:
可以自定義打印實(shí)例時(shí)字符串的內(nèi)容。
案例:
class Cat:'''貓類'''def __init__(self, name):self.name = name self.preys = []def __len__(self):return len(self.preys)def eat(self):print(f'{self.name}正在進(jìn)食!')def __call__(self, *args, **kwargs):self.preys.extend(args)for i in args:print(f'{self.name}抓到了{(lán)i}')print(f'{self.name}抓到了{(lán)len(self)}只獵物!')def __repr__(self):return f'啊,{self.name}抓住了“{",".join(self.preys)}”這些獵物。'def __str__(self):return f'哇,{self.name}抓住了“{",".join(self.preys)}”這些獵物。'white_cat = Cat('大白貓')white_cat('小麻雀', '小老鼠')white_cat('大麻雀', '大老鼠')white_cat('小貓魚(yú)', '大青魚(yú)')print(white_cat)out:大白貓抓到了小麻雀 大白貓抓到了小老鼠 大白貓抓到了2只獵物! 大白貓抓到了大麻雀 大白貓抓到了大老鼠 大白貓抓到了4只獵物! 大白貓抓到了小貓魚(yú) 大白貓抓到了大青魚(yú) 大白貓抓到了6只獵物! 哇,大白貓抓住了“小麻雀,小老鼠,大麻雀,大老鼠,小貓魚(yú),大青魚(yú)”這些獵物。
打印實(shí)例時(shí)會(huì)先調(diào)用__str__方法,沒(méi)有__str__方法時(shí)會(huì)調(diào)用__repr__方法,兩者都沒(méi)有時(shí)打印的是類似這樣的:“<main.Cat object at 0x00000299EE6C45E0>”。
__str__方法和__repr__方法的區(qū)別:
print()時(shí)會(huì)先調(diào)用__str__方法,沒(méi)有__str__方法時(shí)才調(diào)用__repr__方法。
在交互模式下直接輸入實(shí)例回車時(shí)顯示的是__repr__方法返回的內(nèi)容。
str函數(shù)和repr函數(shù)的區(qū)別:
當(dāng)參數(shù)是字符串?dāng)?shù)據(jù)類型時(shí)它們返回的內(nèi)容不完全一致,其他的數(shù)據(jù)類型返回的內(nèi)容完全一致。
test1 = 123ret1 = str(test1)ret2 = repr(test1)print(ret1, ret2, ret1 == ret2)test1 = '123'ret1 = str(test1)ret2 = repr(test1)print(ret1, ret2, ret1 == ret2)out:123 123 True123 '123' False
注意:對(duì)字符串?dāng)?shù)據(jù)進(jìn)行repr后得到的內(nèi)容會(huì)多一對(duì)單引號(hào),長(zhǎng)度會(huì)加2;對(duì)字符串?dāng)?shù)據(jù)進(jìn)行str后得到的內(nèi)容和原來(lái)一樣。
感謝各位的閱讀,以上就是“python的call、len、str、repr怎么使用”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)python的call、len、str、repr怎么使用這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!