您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python中有哪些特殊方法”,在日常操作中,相信很多人在Python中有哪些特殊方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python中有哪些特殊方法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
1、概述
2、常用特殊方法及實現
2.1 _len__()
2.2 __str__()
2.3 __iter__()
2.4 __getitem__()
2.5 __new__()
2.6 使用__new__()實現單例模式
2.7 __call__()
2.8__enter__()
2.9 __add__()
2.10 __del__()
python中特殊方法(魔術方法)是被python解釋器調用的,我們自己不需要調用它們,我們統一使用內置函數來使用。例如:特殊方法__len__()
實現后,我們只需使用len()
方法即可;也有一些特殊方法的調用是隱式的,例如:for i in x
: 背后其實用的是內置函數iter(x)。
下面將介紹一些常用特殊方法和實現。通過實現一個類來說明
一般返回數量,使用len()
方法調用。在__len__()
內部也可使用len()
函數
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))
對象的字符串表現形式,與__repr__()
基本一樣,微小差別在于:
__str__()
用于給終端用戶看的,而__repr__()
用于給開發者看的,用于調試和記錄日志等。
在命令行下,實現__str_()后
,直接輸入對象名稱會顯示對象內存地址;而實現__repr__()
后,跟print
(對象)效果一樣。
若這2個都實現,會調用__str_(),
一般在類中至少實現__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)
返回一個可迭代對象,一般跟__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)
此特殊方法返回數據,也可以替代__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)
__new__()
用來構造一個類的實例,第一個參數是cls
,一般情況下不會使用。而__init__()
用來初始化實例,所以__new__()
比__init___()
先執行。
若__new__()
不返回,則不會有任何對象創建,__init___()
也不會執行;
若__new__()
返回別的類的實例,則__init___()
也不會執行;
用途:可使用__new___()
實現單例模式
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)
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)
實現后對象可變成可調用對象,此對象可以像函數一樣調用,例如:自定義函數,內置函數,類都是可調用對象,可用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個特殊方法:__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)
加法運算符重載以及__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)
對象生命周期結束時調用,相當于析構函數
class Zarten(): def __init__(self, age): self.age = age def __del__(self): print('__del__') z = Zarten(18)
特殊(魔術)方法匯總一覽表
到此,關于“Python中有哪些特殊方法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。