Python基礎-特殊方法整理詳解
1、概述
python中特殊方法(魔術方法)是被python解釋器調用的,我們自己不需要調用它們,我們統(tǒng)一使用內(nèi)置函數(shù)來使用。例如:特殊方法__len__()
實現(xiàn)后,我們只需使用len()
方法即可;也有一些特殊方法的調用是隱式的,例如:for i in x
: 背后其實用的是內(nèi)置函數(shù)iter(x)。
下面將介紹一些常用特殊方法和實現(xiàn)。通過實現(xiàn)一個類來說明
2、常用特殊方法及實現(xiàn)
2.1 _len__()
一般返回數(shù)量,使用len()
方法調用。在__len__()
內(nèi)部也可使用len()
函數(shù)
class Zarten(): def __init__(self, age): self.age = age self.brother = ['zarten_1', 'zarten_2'] def __len__(self): return len(self.brother) #可直接使用len() # return self.age z = Zarten(18) print(len(z))
2.2 __str__()
對象的字符串表現(xiàn)形式,與__repr__()
基本一樣,微小差別在于:
__str__()
用于給終端用戶看的,而__repr__()
用于給開發(fā)者看的,用于調試和記錄日志等。- 在命令行下,實現(xiàn)
__str_()后
,直接輸入對象名稱會顯示對象內(nèi)存地址;而實現(xiàn)__repr__()
后,跟print
(對象)效果一樣。 - 若這2個都實現(xiàn),會調用
__str_(),
一般在類中至少實現(xiàn)__repr__()
class Zarten(): def __repr__(self): return 'my name is Zarten_1' def __str__(self): return 'my name is Zarten_2' z = Zarten() print(z)
2.3 __iter__()
返回一個可迭代對象,一般跟__next__()
一起使用
判斷一個對象是否是:可迭代對象 from collections import Iterable
from collections import Iterable class Zarten(): def __init__(self, brother_num): self.brother_num = brother_num self.count = 0 def __iter__(self): return self def __next__(self): if self.count >= self.brother_num: raise StopIteration else: self.count += 1 return 'zarten_' + str(self.count) zarten = Zarten(5) print('is iterable:', isinstance(zarten, Iterable)) #判斷是否為可迭代對象 for i in zarten: print(i)
2.4 __getitem__()
此特殊方法返回數(shù)據(jù),也可以替代__iter_()
和__next__()
方法,也可支持切片
class Zarten(): def __init__(self): self.brother = ['zarten_1','zarten_2','zarten_3','zarten_4','zarten_5',] def __getitem__(self, item): return self.brother[item] zarten = Zarten() print(zarten[2]) print(zarten[1:3]) for i in zarten: print(i)
2.5 __new__()
__new__()
用來構造一個類的實例,第一個參數(shù)是cls
,一般情況下不會使用。而__init__()
用來初始化實例,所以__new__()
比__init___()
先執(zhí)行。
若__new__()
不返回,則不會有任何對象創(chuàng)建,__init___()
也不會執(zhí)行;
若__new__()
返回別的類的實例,則__init___()
也不會執(zhí)行;
用途:可使用__new___()
實現(xiàn)單例模式
class Zarten(): def __new__(cls, *args, **kwargs): print('__new__') return super().__new__(cls) def __init__(self, name, age): print('__init__') self.name = name self.age = age def __repr__(self): return 'name: %s age:%d' % (self.name,self.age) zarten = Zarten('zarten', 18) print(zarten)
2.6 使用__new__()實現(xiàn)單例模式
class Zarten(): _singleton = None def __new__(cls, *args, **kwargs): print('__new__') if not cls._singleton: cls._singleton = super().__new__(cls) return cls._singleton def __init__(self, name, age): print('__init__') self.name = name self.age = age def __repr__(self): return 'name: %s age:%d' % (self.name,self.age) zarten = Zarten('zarten', 18) zarten_1 = Zarten('zarten_1', 19) print(zarten) print(zarten_1) print(zarten_1 == zarten)
2.7 __call__()
實現(xiàn)后對象可變成可調用對象,此對象可以像函數(shù)一樣調用,例如:自定義函數(shù),內(nèi)置函數(shù),類都是可調用對象,可用callable()
判斷是否是可調用對象
class Zarten(): def __init__(self, name, age): self.name = name self.age = age def __call__(self): print('name:%s age:%d' % (self.name, self.age)) z = Zarten('zarten', 18) print(callable(z)) z()
2.8__enter__()
一個上下文管理器的類,必須要實現(xiàn)這2個特殊方法:__enter_()
和__exit__()
使用with
語句來調用。
使用__enter__()返
回對象,使用__exit__()關閉對象
class Zarten(): def __init__(self, file_name, method): self.file_obj = open(file_name, method) def __enter__(self): return self.file_obj def __exit__(self, exc_type, exc_val, exc_tb): self.file_obj.close() print('closed') with Zarten('e:\\test.txt', 'r') as f: r = f.read() print(r)
2.9 __add__()
加法運算符重載以及__radd__()
反向運算符重載
當對象作加法時,首先會在“+”左邊對象查找__add__(),
若沒找到則在“+”右邊查找__radd__()
class Zarten(): def __init__(self, age): self.age = age def __add__(self, other): return self.age + other def __radd__(self, other): return self.age + other z = Zarten(18) print(z + 10) print(20 + z)
2.10 __del__()
對象生命周期結束時調用,相當于析構函數(shù)
class Zarten(): def __init__(self, age): self.age = age def __del__(self): print('__del__') z = Zarten(18)
特殊(魔術)方法匯總一覽表
到此這篇關于Python基礎-特殊方法詳解的文章就介紹到這了,更多相關Python基礎-特殊方法內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持本站!
版權聲明:本站文章來源標注為YINGSOO的內(nèi)容版權均為本站所有,歡迎引用、轉載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權,請聯(lián)系alex-e#qq.com處理。