Python基礎(chǔ)-特殊方法整理詳解
1、概述
python中特殊方法(魔術(shù)方法)是被python解釋器調(diào)用的,我們自己不需要調(diào)用它們,我們統(tǒng)一使用內(nèi)置函數(shù)來使用。例如:特殊方法__len__()
實現(xiàn)后,我們只需使用len()
方法即可;也有一些特殊方法的調(diào)用是隱式的,例如:for i in x
: 背后其實用的是內(nèi)置函數(shù)iter(x)。
下面將介紹一些常用特殊方法和實現(xiàn)。通過實現(xiàn)一個類來說明
2、常用特殊方法及實現(xiàn)
2.1 _len__()
一般返回數(shù)量,使用len()
方法調(diào)用。在__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ā)者看的,用于調(diào)試和記錄日志等。- 在命令行下,實現(xiàn)
__str_()后
,直接輸入對象名稱會顯示對象內(nèi)存地址;而實現(xiàn)__repr__()
后,跟print
(對象)效果一樣。 - 若這2個都實現(xiàn),會調(diào)用
__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__()
用來構(gòu)造一個類的實例,第一個參數(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)后對象可變成可調(diào)用對象,此對象可以像函數(shù)一樣調(diào)用,例如:自定義函數(shù),內(nèi)置函數(shù),類都是可調(diào)用對象,可用callable()
判斷是否是可調(diào)用對象
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
語句來調(diào)用。
使用__enter__()返
回對象,使用__exit__()關(guān)閉對象
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__()
對象生命周期結(jié)束時調(diào)用,相當于析構(gòu)函數(shù)
class Zarten(): def __init__(self, age): self.age = age def __del__(self): print('__del__') z = Zarten(18)
特殊(魔術(shù))方法匯總一覽表
到此這篇關(guān)于Python基礎(chǔ)-特殊方法詳解的文章就介紹到這了,更多相關(guān)Python基礎(chǔ)-特殊方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Python實現(xiàn)自動用小寫字母替換文件后綴的大寫字母
本文介紹基于Python語言,基于一個大文件夾,遍歷其中的多個子文件夾,對于每一個子文件夾中的大量文件,批量將其文件的名稱或后綴名中的字母由大寫修改為小寫的方法,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2024-04-04Python多線程操作之互斥鎖、遞歸鎖、信號量、事件實例詳解
這篇文章主要介紹了Python多線程操作之互斥鎖、遞歸鎖、信號量、事件,結(jié)合實例形式詳細分析了Python多線程操作互斥鎖、遞歸鎖、信號量、事件相關(guān)概念、原理、用法與操作注意事項,需要的朋友可以參考下2020-03-03Python 調(diào)用 C++ 傳遞numpy 數(shù)據(jù)詳情
這篇文章主要介紹了Python 調(diào)用 C++ 傳遞numpy 數(shù)據(jù)詳情,文章主要分為兩部分,c++代碼和python代碼,代碼分享詳細,需要的小伙伴可以參考一下,希望對你有所幫助2022-03-03Python使用Matplotlib實現(xiàn)創(chuàng)建動態(tài)圖形
動態(tài)圖形是使可視化更具吸引力和用戶吸引力的好方法,它幫助我們以有意義的方式展示數(shù)據(jù)可視化,本文將利用Matplotlib實現(xiàn)繪制一些常用動態(tài)圖形,希望對大家有所幫助2024-02-02